JOIN - добавить ограничение

bsv

Guest
JOIN - добавить ограничение

Задачка нарисовалась явно выше моего уровня по sql-ю.
Имеем:
a.id

b.id
b.faza
b.status

Предварительно это выглядит так
SELECT a.id, b.faza, b.status FROM a LEFT JOIN b ON a.id = b.id

Но мне нужны только записи, где статусы всех фаз одного ид равны 1 или 3 или 5
То есть из
а 1 1
а 2 2
б 1 1
б 5 5
подходит только "б"
Или такое вообще одним запросом не получится?
 

Falc

Новичок
SELECT a.id, b.faza, b.status FROM a INNER JOIN b ON a.id = b.id AND b.status IN (1,3,5)
 

bsv

Guest
tnks вроде получилось. Осталось главное - понять как :)
Что такое INNER JOIN я покамест не понял :(

Таки догнал ...
Еще раз спасибо за оперативность :)
 

bsv

Guest
Что такое JOIN я читал, я не врубился поначалу что именно делает INNER, и как оказалось, не правильно понял LEFT.
Кста, а ентот ман с комментариями гдето можна потянуть? А то тот что у меня только с "оригинальным текстом".

-~{}~ 08.04.04 08:54:

Я тут на немного прояснившуюся голову еще раз все перепроверил, "нифига не аванте" :( ИННЕР, это да, это правильно, но
из
а 1 1
а 2 2
в отчет попадет
а 1 1
а мне нужно _полностью_ отсечь id = а
 

bsv

Guest
Не ... глянь первый пост.
мне нужны только записи, где статусы _всех фаз_ одного ид равны 1 или 3 или 5
Если б я заранее знал все что мне нужно отсечь ... :)
 

bsv

Guest
В том то и дело, что нет. Ключевое условие я выделил - "всех фаз". То есть, если хоть в одной записи с неким ид есть "неподходящая" фаза, выкинуть нужно _все_ записи с этим ид.
 

Falc

Новичок
Попробуй так:

SELECT a2.id
FROM a a1
INNER JOIN b ON a1.id = b.id AND b.status NOT IN (1,3,5)
RIGHT JOIN a a2 ON a2.id = a1.id
WHERE a1.id IS NULL
 

bsv

Guest
на выходе - пусто

EXPLAIN SELECT a2.id
FROM a a1
INNER JOIN b ON a1.id = b.id AND b.status NOT
IN ( 1, 3, 5 )
RIGHT JOIN a a2 ON a2.id = a1.id
WHERE a1.id IS NULL

Impossible WHERE noticed after reading const tables

тебе это чтото говорит?
 

chira

Новичок
Код:
SELECT DISTINCT a.id
FROM a 
  INNER JOIN b b1 ON a.id = b1.id AND b1.status IN (1,3,5)
  LEFT JOIN b b2 ON a.id = b2.id AND b2.status NOT IN (1,3,5)
WHERE b2.id IS NULL
 

bsv

Guest
chira
Ну, если быть точным, то
Код:
SELECT a.id, b1.faza, b1.status
FROM a
INNER JOIN b b1 ON a.id = b1.id AND b1.status
IN ( 1, 3, 5 ) 
LEFT JOIN b b2 ON a.id = b2.id AND b2.status NOT 
IN ( 1, 3, 5 ) 
WHERE b2.id IS NULL
Но таки да. Похоже, самое оно. :)

Falc
Если в два запроса, то возникает куча нюансов. Временные таблицы, управление ими итд итп. А так я запросов напихаю в phpmyadmin, чел ткнет в менюшку, и получит свои данные.
 
Сверху