Два JOIN-а одной таблицы

Армян

Новичок
Два JOIN-а одной таблицы

Здарова.

Не могу понять почему два джоина одной таблицы "не правильно" работают, т.е. не так как я хочу :)

Есть две таблицы:
table1
id
field1
field2

table2
id
t1_id
on

делаю запрос:
PHP:
SELECT `table1`.*,
            COUNT(`t_on`.`id`) AS `lampa_on_count`,
            COUNT(`t_off`.`id`) AS `lampa_off_count`
            FROM `table1`
            LEFT JOIN `table2` AS `t_on` ON `t_on`.`t1_id`=`table1`.`id` AND `t_on`.`on`='1'
            LEFT JOIN `table2` AS `t_off` ON `t_off`.`t1_id`=`table1`.`id` AND `t_off`.`on`='0'
            GROUP BY `table1`.`id`
            ORDER BY `table1`.`id` DESC

Хочу узнать сколько лампочек включено а сколько выключено :)

Получаю почемуто одинаковый результат, т.е. второй лефт жоин перекрывает результат первого.

РАньше делал подобные запросы все работало, сейчас понять не могу в чем дело. Хелп :)
 
ты, видать, не очень понимаешь, как работает декартово произведение множеств.

у тебя в обоих столбцах получается результат, равный (кол-ву включенных лампочек) * (кол-во выключенных лампочек).
 
Wicked
Прочитал! Спасибо.

Еще более запутался... Есть конкретный вопрос:
При двойном жоине одной таблицы, данные ведь не должны пересекатся(умножатся) ? т.е. это должно быть равносильно выборке из двух разных таблица (если делать AS `alias`) так ?

-~{}~ 28.06.08 16:40:

А если они умножаются то выборка должна получится пустой, т.к. совпадающих записей нет...
 
При двойном жоине одной таблицы, данные ведь не должны пересекатся(умножатся)
если записей больше чем одна, ещё как должны

а в твоём случае джойнить таблицу саму с собой не нужно, нужен IF внутри count'а
 
это должно быть равносильно выборке из двух разных таблица (если делать AS `alias`) так ?
да, именно.

НО! ты ошибаешься в том, что в случае с двумя разными таблицами записи не перемножаются :)

А если они умножаются то выборка должна получится пустой, т.к. совпадающих записей нет...
совпадающие записи тут вообще не при делах.

Представь, что у тебя есть одна запись в table1, 2 включенных лампочки с id in (1, 2), и 3 выключенных лампочки с id in (3, 4, 5).
Если сделать запрос:
select table1.id, t_on.id, t_on.on, t_off.id, t_off.on ... дальше все так же, только без group by,
то у тебя получится такой результат, где лампочки соединяются каждая с каждой:
table1.id | t_on.id | t_on.on | t_off.id | t_off.on
1 | 1 | 1 | 3 | 0
1 | 1 | 1 | 4 | 0
1 | 1 | 1 | 5 | 0
1 | 2 | 1 | 3 | 0
1 | 2 | 1 | 4 | 0
1 | 2 | 1 | 5 | 0
соотв-но, если вернуть группировку и count'ы, то получится 1 | 6 | 6
 
Gas
По-моему будет достаточно использовать COUNT(DISTINCT ...), нет разве?
А вообще непонятно, откуда здесь две таблицы. По-моему статус можно хранить там же, где хранятся данные.
 
А вообще непонятно, откуда здесь две таблицы. По-моему статус можно хранить там же, где хранятся данные.
на данный момент у нас все лампочки идентифицируются айдишником, а ты предлагаешь от этого избавиться.

-~{}~ 28.06.08 16:54:

вообще пора в phpfaq написать заметку о том, как дебажить sql
 
Wicked
на данный момент у нас все лампочки идентифицируются айдишником, а ты предлагаешь от этого избавиться.
В смысле?
Насколько я понимаю, на данный момент есть две таблицы

Таблица с лампочками
-------------------------------------
id | Какие-то данные о лампочках

Таблица со статусами
------------------------------------------
id | id лампочки | Статус

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

Таблица
-------------------------
id лампы | Данные о лампе | Статус

Где я предлагаю избавиться от айдишника?
 
Gas
С Count(IF) неочень понял как сделать, т.е. жоинить один раз и как в коунт условие подставить ? чтото вроде
SELECT COUNT(IF(`table2`.`on`='1', `что тут непонятно`, `тут тоже`))
Но этоладно, это в мане надыбаю :) спасибо :)

Bitterman
Тут статус нескольких лампочек, т.е. одной записи первой таблицы может соответствовать сколько угодно лапочек. А за DISTINCT спасибо, помогло :)

Wicked
Спасибо!!! А про дебаг SQL я бы почитал :)
 
Bitterman
Хочу узнать сколько лампочек включено а сколько выключено
т.е. в table2 лежат именно лампочки, а в table1 - что-то другое, что "обладает" несколькими лампочками.

-~{}~ 28.06.08 17:12:

SELECT COUNT(IF(`table2`.`on`='1', `что тут непонятно`, `тут тоже`))
if нам не нужен.
просто SELECT ..., SUM(`table2`.`on`='1'), SUM(`table2`.`on`='0') FROM ...
 
table1.id | t_on.id | t_on.on | t_off.id | t_off.on
1 | 1 | 1 | 1 | 0
1 | 1 | 1 | 2 | 0
1 | 1 | 1 | 3 | 0
1 | 2 | 1 | 1 | 0
1 | 2 | 1 | 2 | 0
1 | 2 | 1 | 3 | 0

тут в столбце t_off.id разве не 3,4,5 ?
 
Сверху