[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: вывод с исключением
maximka787
ребят, подскажите. Есть 2 таблицы
// связь людей с номинациями
CREATE TABLE `tab1` (
`id` int(10) unsigned NOT NULL auto_increment primary_key,
`id_man` int(10),
`id_nomination` int(10)
);

//
связь людей со статусом
CREATE TABLE `tab2` (
`id` int(10) unsigned NOT NULL auto_increment primary_key,
`id_man` int(10),
`status` int(10) // либо 0, либо 1
);

как мне вывести все значения из первой таблицы, чтобы статус из второй был 0
`id_man` это связь



Спустя 11 минут, 55 секунд (24.08.2011 - 12:59) inpost написал(а):
maximka787
Покажи свой запрос, а в целом:

LEFT JOIN `table2` b ON (b.`id_man` = a.`id` AND b.`status` = 0)

Спустя 7 минут, 19 секунд (24.08.2011 - 13:06) maximka787 написал(а):
inpost
SELECT
t1.`id_man`
FROM
`tab1` t1,
`tab2` t2
WHERE
t1.`id_nomination` = '$nom' AND
t2.`status` = 0

выводит правильно но по два раза один id

Спустя 10 минут, 13 секунд (24.08.2011 - 13:16) linker написал(а):
Используем INNER JOIN - выборка только тех элементов из первой таблицы, которые есть во второй, присоединяемой.

Спустя 8 минут, 44 секунды (24.08.2011 - 13:25) inpost написал(а):
maximka787
Я же показал, через LEFT JOIN, а не через WHERE . А так как ты только начал это изучать и хороший парень, то почитай про left join!

Спустя 2 минуты, 41 секунда (24.08.2011 - 13:28) maximka787 написал(а):
inpost
smile.gif ну да, я написал то что было ДО.

Да.. видимо без JOIN в принципе не обойтись в кодинге

Спустя 30 минут, 43 секунды (24.08.2011 - 13:58) neadekvat написал(а):
inpost, неправильно делаешь. Нельзя вешать ограничения на строки в ON (status = 0), он служит только для связи таблиц. Ограничения на строки вешают в WHERE.

P.S. с технической точки зрения - верно, работает, но я про логику запроса, про то, как делать принято и про уважение к тем, кто будет читать эти запросы.

Спустя 20 минут, 43 секунды (24.08.2011 - 14:19) inpost написал(а):
neadekvat
Я раньше вешал на WHERE, но когда цеплял 4 таблицы, где 3-я за вторую, четвертая за третью, то тогда был с этим бок, увы не смогу продемонстрировать сейчас, поэтому я логику перенёс в участок присоединения.

Спустя 13 минут, 17 секунд (24.08.2011 - 14:32) neadekvat написал(а):
Цитата (inpost @ 24.08.2011 - 15:19)
но когда цеплял 4 таблицы, где 3-я за вторую, четвертая за третью, то тогда был с этим бок

А в чем проблема то? Я цеплял по шесть и более таблиц. Но WHERE для того и WHERE, чтобы строки ограничивать. А ON - чтобы их выбирать.

Спустя 8 минут, 1 секунда (24.08.2011 - 14:40) linker написал(а):
Не слушай про LEFT JOIN, оно тут не годится, если не хочешь получить пустые элементы, когда в значение в tab2 есть, а в tab1 нет. Так правильно
SELECT 
*
FROM
`tab1`
INNER JOIN
`tab2`
ON
`tab2`.`id_man` = `tab1`.`id` AND `tab2`.`status` = 0

Спустя 33 минуты, 8 секунд (24.08.2011 - 15:14) inpost написал(а):
linker
Что ты подразумеваешь под "получить пустые элементы"?
Если не нужны пустые, то оставляешь как есть, тогда в случае, если в одной из таблиц отсутствуют записи - выборки не будет.
Если нужны выборки,
WHERE (b.`id_man` IS NULL OR b.`id_man` IS NOT NULL) , тогда будет выборка.

Спустя 7 минут, 21 секунда (24.08.2011 - 15:21) linker написал(а):
Вот чтобы этого гумна не писать существует INNER JOIN.

Спустя 29 минут, 4 секунды (24.08.2011 - 15:50) neadekvat написал(а):
Так если даже при LEFT JOIN повесить WHERE b2.status = 0, то разве могут придти строки, у которых нечего брать из b2? NULL и 0, насколько я помню, это разные вещи.

Спустя 17 минут, 3 секунды (24.08.2011 - 16:07) inpost написал(а):
Вообщем, что-то я ничего не понял smile.gif

Спустя 11 минут, 40 секунд (24.08.2011 - 16:19) linker написал(а):
inpost
НУ что не понятного, INNER JOIN или просто JOIN - это пересечение таблиц, т.е. только совпавшие записи из первой и второй таблицы. LEFT JOIN - это тоже пересечение, но к результатам добавляются записи из второй таблицы, не имеющие совпадения с первой (столбцы первой таблицы забиваются NULL). Когда говорят, что хочу получить все записи из первой таблицы, которые связаны со второй, то используют INNER JOIN (можно просто JOIN). И не надо здесь никаких лишних, нелогичных условий в WHERE, они только тормозят запрос.


_____________
..Работает - не трогай!
Быстрый ответ:

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