#sql #where-in
#sql #где-в
Вопрос:
У меня есть 3 таблицы, перечисленные ниже:
Blog BlogArticle Article
---- ----------- -------
id
id------blog_id -id
title article_id__/ title
Этот SQL описывает то, что я хочу:
SELECT *
FROM `article`
WHERE `article`.`id` NOT IN (
SELECT CONCAT(`blog_article`.`article_id`)
FROM `blog_article`
WHERE `blog_article`.`blog_id` = 1 -- example value
)
Проблема в том, что в этом случае у меня есть большое значение NOT IN, и, насколько я знаю, это повлияет на производительность сервера (я не уверен, так как я никогда не пытался провести бенчмарк или погуглить его). Есть предложения?
Комментарии:
1. Какую базу данных вы используете? SQL server 2008, например, преобразует IN в EXISTS. Я где-то читал здесь, что последняя версия MySQL делает то же самое. Вы можете сделать то же самое, если в документации вашей БД ничего подобного не упоминается
2. @Icarus: SQL server 2008 не является «базой данных». Предложение: спросите: «Какой продукт SQL …?»
3. @onedaywhen: «Какую базу данных вы используете?» и «Sql Server 2008 …» — это 2 разных предложения. Если у вас есть проблемы с пониманием прочитанного, я ничего не могу с этим поделать.
4. @Icarus: Вы можете помочь мне понять, почему вы хотели бы знать, какую базу данных они используют. Если бы я сказал вам, что они используют базу данных «Блоги» своего предприятия или базу данных tempdb / Master и т.д., Как бы это помогло?
5. @Icarus «Какую базу данных вы используете? Например, SQL server 2008 …» Эти два предложения должны быть независимыми предложениями? Для меня второе звучит зависимо от первого.
Ответ №1:
Попробуйте это :
SELECT *
FROM `article`
LEFT JOIN `blog_article` ON CONCAT(`blog_article`.`article_id`) = `article`.`id`
AND `blog_article`.`blog_id` = 1 -- example value
WHERE `blog_article`.`article_id` is null --replace the not in
Комментарии:
1. Эй, спасибо, это работает, если я запускаю напрямую, но я думаю, что у меня есть некоторые проблемы при использовании класса Yii AR. Сообщение об ошибке «SQLSTATE [23000]: нарушение ограничения целостности: столбец 1052 ‘id’ в списке полей неоднозначен.». Заранее спасибо.
2. Извините, не знаю класс Yii AR, по крайней мере, ваш sql работает, вы могли бы написать этот ответ как принятый и опубликовать новый вопрос для своего класса
3. Столбец @user1032315 в основном содержит неоднозначные ошибки (всегда?) означает, что в соединении есть два столбца с одинаковым именем. Попробуйте
SELECT 'article'.*
вместо простоSELECT *
.