Два 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

Новичок
ты, видать, не очень понимаешь, как работает декартово произведение множеств.

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

Армян

Новичок
Wicked
Прочитал! Спасибо.

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

-~{}~ 28.06.08 16:40:

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

Gas

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

а в твоём случае джойнить таблицу саму с собой не нужно, нужен IF внутри count'а
 

Wicked

Новичок
это должно быть равносильно выборке из двух разных таблица (если делать 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
 

Bitterman

Новичок
Gas
По-моему будет достаточно использовать COUNT(DISTINCT ...), нет разве?
А вообще непонятно, откуда здесь две таблицы. По-моему статус можно хранить там же, где хранятся данные.
 

Wicked

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

-~{}~ 28.06.08 16:54:

вообще пора в phpfaq написать заметку о том, как дебажить sql
 

Bitterman

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

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

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

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

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

Где я предлагаю избавиться от айдишника?
 

Армян

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

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

Wicked
Спасибо!!! А про дебаг SQL я бы почитал :)
 

Wicked

Новичок
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 ?
 
Сверху