2013-03-23 2 views
1

У меня есть одна таблица под названием «предложения» с столбцами «offer_ид», «предложение» и «спрятанное». Первичный ключ - «offer_ид».Сложный запрос MySQL на две таблицы

У меня есть другая таблица под названием «даты» со столбцами «hid», «date», «offer_id» и некоторые другие. Первичный ключ - это «дата» и «спрятан». То же самое значение «offer_ид» может существовать во многих строках (или вообще отсутствует).

Как написать запрос mySQL, чтобы найти offer_ids, которые существуют в «предложениях», но не в «датах»?

Я попытался

SELECT offers.offer_id FROM offers JOIN dates ON offers.offer_id NOT IN dates 

, но это не сработало.

+0

Это может помочь вам понять: HTTP: // WWW .codinghorror.com/blog/2007/10/a-visual-explain-of-sql-joins.html –

ответ

3

Для больших таблиц этот вариант будет намного быстрее, чем NOT IN: внешнее соединение к dates и затем процеживают где dates.offer_id равна нулю:

SELECT offers.offer_id 
FROM offers 
LEFT OUTER JOIN dates ON offers.offer_id = dates.offer_id 
WHERE dates.offer_id IS NULL 
+1

Красивый, интуитивно понятный, чистый запрос. –

2

Я думаю, что это должно сработать для вас.

SELECT offers.offer_id FROM offers where offer_id NOT IN (select offer_id from dates) 
+3

Слишком плохо, что нужно запускать запрос по датам для каждого предложения .. Будет ли он работать, если внутренний запрос был таким: (SELECT offer_id FROM date WHERE date.offer_id = offers.offer_id) ?? Это наверняка ускорит процесс. Хотя я не эксперт по SQL любым способом –

+0

Хорошая точка @SpencerLockhart, выполняющая предложение where, ускорит его. – Robert

+0

Мне кажется неблагодарным, что я не принимаю этот ответ, но я могу выбрать только его. Я протестировал как решение graceemile, так и одно из Robert, измененное @SpencerLockhart, и оба они дали одинаковые результаты в одно и то же время. Поэтому я тоже мог бы использовать. На самом деле я собираюсь использовать тот, который я поставил галочкой, из-за того, что он не избегал IN IN. Спасибо всем. – TrapezeArtist