SQL Проверка, если одна из записей не существует с объединением другой таблицы - PullRequest
0 голосов
/ 18 ноября 2018

Я пытался найти решение, но ничего не нашел.Я хочу создать код SQL, который проверяет, не существует ли одна запись в другой таблице.

Таблицы SQL:

Table name: ads
╔═══════╦═════════╗
║ ad_id ║ user_id ║
╠═══════╬═════════╣
║  1    ║ Jeff    ║
║  2    ║ Jeff    ║
╚═══════╩═════════╩

Second Table name: premium
╔═══════╦═════════╗
║ ad_id ║ user_id ║
╠═══════╬═════════╣
║  1    ║ Jeff    ║

Я хочу проверить таблицу объявлений, если user_id =У Джеффа нет записи в таблице Премиум.Едва ли это должно показать мне в этом случае ad_id = 2

То, что я пытался это:

SELECT * FROM ads 
INNER JOIN premium ON premium.ad_id = ads.id 
WHERE premium.user_id = 'Jeff'

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018
SELECT p.`ad_id` as ad_id, p.`user_id` as user_id
FROM `premium` p 
INNER JOIN `ads` a ON a.`user_id` = p.`user_id`
WHERE p.`user_id` = 'Jeff'
GROUP BY p.`user_id`
HAVING a.`ad_id` = MIN(a.`ad_id`)

MIN(a.ad_id) вы должны заменить условием, какую запись вы хотите выбрать из таблицы ads

и так далее.Если вам нужны записи Check if one of a records is not existing in another table, то

SELECT COUNT(a.`ad_id`) as cnt
FROM `premium` p 
INNER JOIN `ads` a ON a.`user_id` = p.`user_id`
WHERE p.`user_id` = 'Jeff'
GROUP BY p.`user_id`
HAVING a.`ad_id` <> MIN(a.`ad_id`)

Итак, если cnt > 0, это означает, что записи существуют!

Если у вас есть сильные отношения в p.ad_id === a.ad_id:

SELECT COUNT(a.`ad_id`) as cnt
FROM `premium` p 
INNER JOIN `ads` a ON a.`user_id` = p.`user_id`
WHERE p.`user_id` = 'Jeff' AND a.`ad_id` <> p.`ad_id`
0 голосов
/ 18 ноября 2018

Я рекомендую not exists:

select a.*
from ads a
where not exists (select 1
                  from premium p
                  where p.ad_id = a.ad_id and p.user_id = a.user_id
                 );

Это почти прямой перевод вашей постановки задачи.Кроме того, с индексом premium(ad_id, user_id) он также должен иметь очень хорошие характеристики производительности.

0 голосов
/ 18 ноября 2018

Вы можете использовать коррелированный подзапрос с NOT IN

SELECT a.*
  FROM ads a 
 WHERE a.ad_id NOT IN
( SELECT p.ad_id FROM premium p WHERE p.user_id = a.user_id and p.user_id = 'Jeff' );

Демонстрация SQL Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...