[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите с небольшим запросом к двум таблицам
2038
Вот такой запрос работает (выбирает одинаковые поля из двух таблиц)

select breeds.id from breeds,phpbb_forums where breeds.id=phpbb_forums.breed_id


А мне нужно, чтобы запрос выбирал из таблицы breeds поле id, которое не использовалось во второй таблице phpbb_forums в поле breed_id

Если короче, то вот эта конструкция не работает:
select breeds.id from breeds,phpbb_forums where breeds.id!=phpbb_forums.breed_id



Спустя 22 минуты, 16 секунд (11.01.2011 - 12:02) T1grOK написал(а):
Тоже когда то заморачивался над такой задачей. Вот лови:

SELECT breeds.id
FROM breeds
LEFT JOIN phpbb_forums
ON breeds.id=phpbb_forums.breed_id
WHERE phpbb_forums.breed_id IS NULL

Спустя 4 минуты, 5 секунд (11.01.2011 - 12:06) SlavaFr написал(а):
или так:
select breeds.id from breeds where id not in(select phpbb_forums.breed_id from phpbb_forums)

Спустя 2 минуты, 51 секунда (11.01.2011 - 12:09) 2038 написал(а):
Цитата (T1grOK @ 11.01.2011 - 09:02)
Тоже когда то заморачивался над такой задачей. Вот лови:

SELECT breeds.id
FROM breeds
LEFT JOIN phpbb_forums
ON breeds.id=phpbb_forums.breed_id
WHERE phpbb_forums.breed_id IS NULL

Спасибо огромное, оно заработало!

Не прокомментируете на будущее (в т.ч. тем, кто придёт сюда по поиску), в чём, собственно, загвоздка?

Спустя 4 минуты, 39 секунд (11.01.2011 - 12:14) 2038 написал(а):
Цитата (SlavaFr @ 11.01.2011 - 09:06)
или так:
select breeds.id from breeds where id not in(select phpbb_forums.breed_id from phpbb_forums)

Да, вот этот вариант разобрал, понял.

Теперь осталось понять, как работает в другом ответе JOIN, и почему, собственно, не работал первоначальный вариант.

Спустя 9 минут, 43 секунды (11.01.2011 - 12:24) SlavaFr написал(а):
left join соединяет таблицы так, что показывает все совпадающие поля с правой таблицы, а там где совпадений нет пишет NULL. Тоесть там где в правой NULL это и есть те строчки с левой таблицы у которых нет не чего в правой. Остается только их отселектировать посредством "WHERE правое_поле IS NULL"

Спустя 34 минуты, 21 секунда (11.01.2011 - 12:58) 2038 написал(а):
Цитата (SlavaFr @ 11.01.2011 - 09:24)
left join соединяет таблицы так, что показывает все совпадающие поля с правой таблицы, а там где совпадений нет пишет NULL. Тоесть там где в правой NULL это и есть те строчки с левой таблицы у которых нет не чего в правой. Остается только их отселектировать посредством "WHERE правое_поле IS NULL"

Спасибо, всё понял.
Оба варианта хорошо.
Но вариант с Join, как я понимаю, в два раза быстрее, т.к. происходит только один запрос.

Спустя 7 часов, 46 минут, 12 секунд (11.01.2011 - 20:44) SlavaFr написал(а):
Цитата (2038 @ 11.01.2011 - 09:58)
Но вариант с Join, как я понимаю, в два раза быстрее, т.к. происходит только один запрос.

абсолютно не дoказанно.

Спустя 13 часов, 23 минуты, 34 секунды (12.01.2011 - 10:08) linker написал(а):
С JOIN действительно быстрее.

Спустя 2 часа, 51 минута, 13 секунд (12.01.2011 - 12:59) SlavaFr написал(а):
Цитата (linker @ 12.01.2011 - 07:08)
С JOIN действительно быстрее.

это зависит от базы данных, от их версий а в некоторых системах даже от количества данных. Как правило sql-парсер после разбора запроса, сам решает как ему лучьше вытягивать информацию из базы.

Спустя 8 минут, 15 секунд (12.01.2011 - 13:07) linker написал(а):
Вот здесь вот
... in(select phpbb_forums.breed_id from phpbb_forums)
очень сложно решить как лучше вытянуть данные. Я точно не могу сказать, как реально мускул будет это делать, но у меня для такого запроса есть свое мнение:
допустим
select breeds.id from breeds ...
вытянул первую запись, далее есть условие
... where id not in ...
т.е. мускул должен решить подходит ли значение поля id, полученной записи, под условие или нет, для этого сначала придется выполнить условие в скобках
... select phpbb_forums.breed_id from phpbb_forums ...
и потом сопоставить id с полученными значениями phpbb_forums.breed_idи так будет продолжаться для всех записей из таблицы breeds. Это по-моему неразумно и слишком медленно по сравнению с банальным JOIN.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.