Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Два COUNT(*) в LEFT JOIN. Как? / 14 сообщений из 14, страница 1 из 1
06.09.2013, 01:36:39
    #38388578
grecha10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
Привет!

Нужно подсчитать количество комментариев и товаров у фирмы.

С одним COUNT(*) работает отлично:
Код: sql
1.
2.
3.
4.
SELECT f.*, COUNT(r.id) as num_reviews
FROM table_firm f
LEFT JOIN table_reviews r ON r.idFirm=f.id
GROUP BY f.id



А с двумя неправильно: num_reviews=num_products=COUNT(p.id)
Код: sql
1.
2.
3.
4.
5.
SELECT f.*, COUNT(r.id) as num_reviews, , COUNT(p.id) as num_products
FROM table_firm f
LEFT JOIN table_reviews r ON r.idFirm=f.id
LEFT JOIN table_products p ON p.idFirm=f.id
GROUP BY f.id



Что не так, как сделать, кто знает?
...
Рейтинг: 0 / 0
06.09.2013, 01:38:06
    #38388580
grecha10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
Там синтаксическая ошибка во втором примере, но это только в примере)
...
Рейтинг: 0 / 0
06.09.2013, 05:04:24
    #38388596
Два COUNT(*) в LEFT JOIN. Как?
grecha10Что не так, как сделать, кто знает?Связи между таблицами, повидимому, не "один к одному", а "один ко многим", вот и происходит "размножение".
Варианты решения:
1) Добавить в агрегаты COUNT модификатор DISTINCT
2) Делать предагрегированные деривед-таблицы по table_reviews и table_products с последующим джойном их к таблице table_firm
...
Рейтинг: 0 / 0
06.09.2013, 08:56:31
    #38388654
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
grecha10
Код: sql
1.
2.
3.
SELECT f.*, 
-- поскипано
GROUP BY f.id


Группировка "ниачём"...

grecha10Что не так, как сделать, кто знает?
Если f.id и p.id - синтетические ключи (или хотя бы просто уникальны), то COUNT(DISTINCT ...). Иначе - только подзапросы.
...
Рейтинг: 0 / 0
06.09.2013, 10:11:49
    #38388736
grecha10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
Спасибо! Все сделал через DISTINCT

2) Делать предагрегированные деривед-таблицы по table_reviews и table_products с последующим джойном их к таблице table_firm
Что то я не могу представить как вставить COUNT() в LEFT JOIN. Покажите пример плз, хоть и сделал уже, но очень интересно для расширения кругозора.

SELECT f.*,
-- поскипано
GROUP BY f.id

Группировка "ниачём"...

Вы ошибаетесь. Без этой группировки работать не будет.
...
Рейтинг: 0 / 0
06.09.2013, 10:26:57
    #38388754
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
grecha10,

верно - не будет. Но и Акина - абсолютно прав - "ни а чем"... :)
...
Рейтинг: 0 / 0
06.09.2013, 10:48:29
    #38388787
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
grecha10Что то я не могу представить как вставить COUNT() в LEFT JOIN. Покажите пример плз, хоть и сделал уже, но очень интересно для расширения кругозора.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select p.*
,ifnull(t1.amt,0)
, -- сами поймёте?
from parent p
left join (
 select p.id,count(*)
 from parent p
 join child1 c on p.id=c.pid
 group by 1
) t1 on p.id=t1.id
left join (
 select p.id,count(*)
 from parent p
 join child2 c on p.id=c.pid
 group by 1
) t2 on p.id=t2.id
...
Рейтинг: 0 / 0
06.09.2013, 11:03:51
    #38388817
grecha10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
Arhat109grecha10,

верно - не будет. Но и Акина - абсолютно прав - "ни а чем"... :)
Хм) Всегда считал выражение "ниачем" синонимом к "ни к чему, лишнее, пустое, не нужное". Какое же оно "не нужное" если без него не работает?

tanglir, спасибо! Только не понял почему t.amt является синонимом для COUNT()
...
Рейтинг: 0 / 0
06.09.2013, 11:05:00
    #38388823
Два COUNT(*) в LEFT JOIN. Как?
tanglir,

вот честно не понял, зачем ты в деривед-таблицы засунул джойны на родительскую таблицу? Что мешало просто группировать дочернюю таблицу, без её джойна на родителя, а уж после джойнить к родителю результат агрегации?
...
Рейтинг: 0 / 0
06.09.2013, 11:05:48
    #38388824
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
Добрый Э - Эхвот честно не понял, зачем ты в деривед-таблицы засунул джойны на родительскую таблицу?я сейчас смотрю и сам не понимаю
...
Рейтинг: 0 / 0
06.09.2013, 11:06:21
    #38388826
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
grecha10Только не понял почему t.amt является синонимом для COUNT()потому что мне надо было написать count(*) as amt
виноват, обещаю исправиться :)
...
Рейтинг: 0 / 0
06.09.2013, 13:03:14
    #38389013
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
grecha10Всегда считал выражение "ниачем" синонимом к "ни к чему, лишнее, пустое, не нужное". Какое же оно "не нужное" если без него не работает?Всё это - синонимы к выражению "ни о чём".
В данном же случае, да и вообще, смысл использованного выражения в том, что результат действа, о котором сказано, что оно "ниачём", либо неверно прогнозируется, либо вообще не прогнозируется, но по-любому получится ерунда.
Вот будь на том месте
Код: sql
1.
2.
3.
SELECT f.id, 
-- поскипано
GROUP BY f.id

так никто бы и не возмущался...
...
Рейтинг: 0 / 0
06.09.2013, 14:15:49
    #38389112
grecha10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
tanglir, Akina, спасибо за разъяснения. Я реально стал умнее)
...
Рейтинг: 0 / 0
06.09.2013, 16:51:23
    #38389404
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два COUNT(*) в LEFT JOIN. Как?
Akinagrecha10Всегда считал выражение "ниачем" синонимом к "ни к чему, лишнее, пустое, не нужное". Какое же оно "не нужное" если без него не работает?Всё это - синонимы к выражению "ни о чём".
В данном же случае, да и вообще, смысл использованного выражения в том, что результат действа, о котором сказано, что оно "ниачём", либо неверно прогнозируется, либо вообще не прогнозируется, но по-любому получится ерунда.
Вот будь на том месте
Код: sql
1.
2.
3.
SELECT f.id, 
-- поскипано
GROUP BY f.id

так никто бы и не возмущался...В MySQL группировка "оптимизирована" как раз для таких случаев
То есть (почти дословно по мануалу), если значения во всех строках дублируются. то их можно не указывать в GROUP BY, достаточно указать одно поле для группировки.

Что в данном случае и выполняется
Код: sql
1.
2.
3.
4.
SELECT f.*, COUNT(r.id) as num_reviews
FROM table_firm f
LEFT JOIN table_reviews r ON r.idFirm=f.id
GROUP BY f.id
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Два COUNT(*) в LEFT JOIN. Как? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]