2013-04-30 65 views
0

我有table1(id,name),table2(id [FK to table1.id],user_id,visit)。 对于每个table1.id,我需要显示它在table1中的名字,统计用户并显示属于这个id的user_id,当table2.visit = 1时,统计用户并显示他们的user_id属于这个id,当table2.visit = 0。此外,table1中的某些id可能不在table2中,因为这些id我想在计数器中为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 2013-04-30 22:37:50

+0

对于COALESCE(sth_that_can_be_null,0),任何版本都无法显示NULL,它的功能是什么 - 显示不是NULL的第一个参数。 Group_concat可能返回blob为整数,你可以显式地将你的id转换为字符串来获得一个字符串。 – piotrm 2013-04-30 22:44:22

+0

'convert(COALESCE(visitors.visitors_list,'')using utf8)as list_of_visitors_id,'和nonvisitor的相同开始工作,就像上面的链接一样! – Anton 2013-05-01 05:50:48

相关问题