Избегайте SQL, КОТОРОГО НЕТ В предложении

#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 * .