2012-02-28 105 views
0

我有表table_one, table_two, table_three, table_four所有结构大致相同。 它有列id, name, status, user_id来自多个表的MySQL请求数

i.g.除了table_four之外,我在每个表中多次使用约翰用户user_id 345status对于一些entrys是1和其他条目的是0

现在我需要计数与一个查询多少次这个用户的状态是每个表中1。

所以我:

SELECT table_one.user_id, 
    SUM(CASE WHEN table_one.status = 1 THEN 1 ELSE 0 END) AS count_tblone 
    SUM(CASE WHEN table_two.status = 1 THEN 1 ELSE 0 END) AS count_tbltwo 
    SUM(CASE WHEN table_three.status = 1 THEN 1 ELSE 0 END) AS count_tblthree 
    SUM(CASE WHEN table_four.status = 1 THEN 1 ELSE 0 END) AS count_tblfour 
FROM table_one 
    LEFT JOIN table_one ON table_one.user_id = table_one.user_id 
    LEFT JOIN table_two ON table_two.user_id = table_one.user_id 
    LEFT JOIN table_three ON table_three.user_id = table_one.user_id 
    LEFT JOIN table_four ON table_four.user_id = table_one.user_id 

WHERE tbl_one.user_id = 345 

问题是,请求输出4,0,0,0,当它应该是2,1,1,0

如果我刚离开SUM(CASE WHEN table_one.status = 1 THEN 1 ELSE 0 END) AS count_tblone - count_tblone将等于4,即使在table_one - status字段等于1,用户345的只有两条记录。

+1

什么是不工作?另外:你的意思是在'LEFT JOIN'中使用'= tbl_resume.candidate_id'吗? – Edward 2012-02-28 20:17:24

+0

对不起,我现在修好了。 – JohnA 2012-02-29 18:19:37

+0

每个表都以自己的键连接到自己,这是没有意义的。我的想法是你从table_one到table_two,table_two到table_three,table_three到table_four。请纠正我,如果我错了 – 2012-02-29 18:49:31

回答

0

这是更多的打字,但我建议UNION,,特别是如果用户可能不在table_one

SELECT 
    SUM(count_tblone) AS count_tblone, 
    SUM(count_tbltwo) AS count_tbltwo, 
    SUM(count_tblthree) AS count_tblthree, 
    SUM(count_tblfour) AS count_tblfour 
FROM (
    SELECT 
     SUM(CASE WHEN table_one.status = 1 THEN 1 ELSE 0 END) AS count_tblone, 
     0 AS count_tbltwo, 
     0 AS count_tblthree, 
     0 AS count_tblfour 
    FROM table_one 
    WHERE tbl_one.user_id = 345 
    UNION 
    SELECT 
     0 AS count_tblone, 
     SUM(CASE WHEN table_two.status = 1 THEN 1 ELSE 0 END) AS count_tbltwo, 
     0 AS count_tblthree, 
     0 AS count_tblfour 
    FROM table_two 
    WHERE tbl_one.user_id = 345 
    UNION 

...表3和表4 ...

) AS tblMyUnionedTables 
+0

此外,如果将结果检索为4个一列的行而不是1个四列的行,那么您可以取出'0 AS count_tbl ...'项,并且您可以从中得到结果现在是上述答案中的一个子表。请注意,在这种情况下,您将需要'UNION ALL'来代替'UNION'。同样在这种情况下,你可以在where子句中添加'status = 1'并获得计数。 – 2012-02-29 20:06:07