2013-04-30 8 views
0

У меня есть таблица1 (id, name), table2 (id [FK to table1.id], user_id, visit). Для каждого table1.id мне нужно показать его имя из таблицы1, подсчитать пользователей и показать их user_id, принадлежащий этому id, и когда table2.visit = 1, подсчитать пользователей и показать свой user_id, который принадлежит этому идентификатору, и когда table2.visit = 0. Кроме того, некоторый идентификатор из таблицы1 может отсутствовать в таблице2, для этих идентификаторов я хочу иметь 0 в счетчиках.Приращение одного значения на основе значений столбца и группы mysql

В таблице результат должен выглядеть следующим образом:

id|name|count_visitors|list_of_visitors_id|count_non_visitors|list_of_non_visitors_id| 
1 |a |2    |5,10    |1     |4      | 

Не могли бы вы помочь с запросом?

ответ

1
SELECT t1.name, 
     COALESCE(visitors.visitors_count, 0) AS `count_visitors`, 
     COALESCE(visitors.visitors_list, '') AS `list_of_visitors_id`, 
     COALESCE(nonvisitors.nonvisitors_count, 0) AS `count_non_visitors`, 
     COALESCE(nonvisitors.nonvisitors_list, '') AS `list_of_non_visitors_id` 
FROM table1 t1 
LEFT JOIN 
(SELECT id, GROUP_CONCAT(user_id) AS visitors_list, COUNT(*) AS visitors_count 
    FROM table2 
    WHERE visit = 1 
    GROUP BY id) visitors 
ON t1.id = visitors.id 
LEFT JOIN 
    (SELECT id, GROUP_CONCAT(user_id) AS nonvisitors_list, COUNT(*) AS nonvisitors_count 
    FROM table2 
    WHERE visit = 0 
    GROUP BY id) nonvisitors 
ON t1.id = nonvisitors.id 

Попробуйте сами: Sqlfiddle

И если вам это нужно для одного пользователя просто добавьте одну строку в конце:

WHERE t1.id = 1 
+0

отлично. Большое спасибо! Но мой mysql показывает NULL в списках, когда они пусты и blob, когда они не являются. Не могли бы вы предложить причину? старой версии mysql? теперь это 5.1.66 – Anton

+0

С COALESCE (sth_that_can_be_null, 0) нет никакой возможности для какой-либо версии показывать NULL, что она делает - показывает первый аргумент, который не является NULL. Group_concat может возвращать blob для целых чисел, вы можете явно преобразовать свои идентификаторы в строки, чтобы получить строку. – piotrm

+0

'конвертировать (COALESCE (visitors.visitors_list, '') с помощью utf8) AS list_of_visitors_id,' и то же самое для невизеров начал работать, как в ссылке выше! – Anton

Смежные вопросы