Сложная выборка из двух таблиц

Николай II
Дата: 23.12.2012 01:27:26
Есть две таблицы
Картинка с другого сайта.

Нужно отобрать с Table1 Id у которых Balance=0 и при этом нет ни одной соответствующей им записи в Table2 с Bool=1.
Т.е. для данного примера правильный ответ это:
Id=1 (все три поля Bool c PokupatelId=1 в Table2 равны 0)
Id=3 (так как у него вообще нет записей в Table2)
MikkiMouse
Дата: 23.12.2012 03:02:33
Николай II,

Просто головоломная задача:
SELECT t1.id, t1.balance
FROM table1 AS t1
WHERE t1.balance = 0
    AND NOT EXISTS (
        SELECT 1 
        FROM table2 AS t2 
        WHERE t2.pokupatel_id = t1.id AND t2.bool = 1
    )
Николай II
Дата: 24.12.2012 14:46:12
MikkiMouse
Николай II, просто головоломная задача

MikkiMouse, не знаю с иронией вы назвали эту задачу головоломной или нет, но я бы ее точно не решил в один запрос как вы, потому что я даже не знал о существовании NOT EXISTS.
Огромное Вам спасибо, все работает, я счастлив что решилась самая сложная часть в моейм мини-проекте!
Earlo87
Дата: 28.12.2012 02:14:19
решил не создавать новую тему напишу тут
вообщем есть таблица t1 с двумя полями id, name и есть вторая табличка t2 в ней много и есть поле key так вот нужно выбрать так чтобы при выборе из t1 записи также выбрались поля из t2 где поле key совпадает с t1.id то есть примерно так:
SELECT t1.*, t2.*  FROM t1
LEFT JOIN t2 ON t2 = t1.key

проблема в том что из t2 выберется только одна запись относящаяся по key к t1 допустим а мне надо выбрать все записи из t2 относящиеся к записи в t1
Картинка с другого сайта.

можно конечно сделать обратным запросом из t2 но мне надо выбрать из t1 все записи даже если в t2 для них нет связанных записей, я расcчитывал что можно сделать 1 запросом к t1 чтобы на выходе получилось примерно это:

$res[id] = 1
$res[name] = item
$res[t2] = array(
                   0 = array('id'=> 1, 'name' => item, key => 1),
                   1 = array('id'=> 2, 'name' => item, key => 1),
                   2 = array('id'=> 3, 'name' => item, key => 1)
                      )  

$res[id] = 2
$res[name] = item
$res[t2] = array(
                   0 = array('id'=> 4, 'name' => item, key => 2),
                   1 = array('id'=> 5, 'name' => item, key => 2),
                   2 = array('id'=> 6, 'name' => item, key => 2)
                      ) 


вообщем кто понял подскажите =)
bochkov
Дата: 28.12.2012 05:05:55
Николай II,
можно без Exists
SELECT  * 
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.id=t2.pokupatelid AND t2.bool
WHERE t1.balance=0 AND t2.pokupatelid IS NULL
bochkov
Дата: 28.12.2012 05:17:26
Earlo87,
запрос работать не будет
SELECT t1.*, t2.*  FROM t1
LEFT JOIN t2 ON t2 = t1.key

судя по схеме у t1 нет поля key, а синтаксис "t2= t1.key" неправильный
наверное должно быть так
SELECT t1.*, t2.*  FROM t1
LEFT JOIN t2 ON t1.id= t2.key

Earlo87
проблема в том что из t2 выберется только одна запись относящаяся по key к t1 допустим а мне надо выбрать все записи из t2 относящиеся к записи в t1

это вы сами придумали или проверяли, что именно так и будет?
ILL HEAD
Дата: 28.12.2012 05:30:39
автор
есть таблица t1 с двумя полями id, name и есть вторая табличка t2 в ней много и есть поле key так вот нужно выбрать так чтобы при выборе из t1 записи также выбрались поля из t2 где поле key совпадает с t1.id то есть примерно так:
SELECT t1.*, t2.*  FROM t1
LEFT JOIN t2 ON t1.id = t2.key

автор
проблема в том что из t2 выберется только одна запись относящаяся по key к t1 допустим а мне надо выбрать все записи из t2 относящиеся к записи в t1
да ну?
чтобы не было лишнего можно
SELECT t1.*, t2.*  
FROM t1 LEFT JOIN t2 ON t1.id = t2.key
WHERE NOT ISNULL(t2.key )

-- или

SELECT t1.*, t2.*  
FROM t1 LEFT JOIN t2 ON t1.id = t2.key AND NOT ISNULL(t2.key)
ILL HEAD
Дата: 28.12.2012 05:31:24
bochkov, сорри. апаздал )
Earlo87
Дата: 28.12.2012 11:09:08
bochkov
Earlo87,
запрос работать не будет
SELECT t1.*, t2.*  FROM t1
LEFT JOIN t2 ON t2 = t1.key

судя по схеме у t1 нет поля key, а синтаксис "t2= t1.key" неправильный
наверное должно быть так
SELECT t1.*, t2.*  FROM t1
LEFT JOIN t2 ON t1.id= t2.key

Earlo87
проблема в том что из t2 выберется только одна запись относящаяся по key к t1 допустим а мне надо выбрать все записи из t2 относящиеся к записи в t1

это вы сами придумали или проверяли, что именно так и будет?


сори ошибся, ночью плохо соображал, вообщем вроде решил проблему а выводилась у меня одна запись из за того что имена первых двух полей в обоих таблицах совпадали...))))) зафейлился)
попробовал использовать GROUP_CONCAT вроде все нормально но если его использовать придется мудрить с распарсиванием нафиг его
ps всем спс