SQL从多个表中选择数据和计数,因为每个表中都有一个公共列

时间:2014-06-12 19:19:52

标签: mysql sql count

考虑以下三个表:

Table: A          Table: B              Table: C
+----+-----+      +-----+--------+      +--------+----------+
| id | cid |      | cid | cat_id |      | cat_id | cat_name |
+----+-----+      +-----+--------+      +--------+----------+
| 1  |  33 |      | 33  |      6 |      |   1    |   AAAAA  |
| 2  |  33 |      | 33  |     20 |      |   2    |   BBBBB  |
| 3  |  33 |      | 33  |     59 |      |   3    |   CCCCC  |
| 4  |  33 |      | 33  |     88 |      |   4    |   DDDDD  |
| 5  |  33 |      | 35  |      8 |      |   5    |   EEEEE  |
| 6  |  86 |      | 86  |      1 |      |   6    |   FFFFF  |
| 7  |  86 |      | 86  |     14 |      |   7    |   GGGGG  |
| 8  |  99 |      | 86  |     45 |      |   14   |   HHHHH  |
| 9  | 100 |      | 86  |     57 |      |   20   |   IIIII  |
+----+-----+      | 86  |     59 |      |   42   |   JJJJJ  |
                  | 86  |     94 |      |   45   |   KKKKK  |
                  | 98  |      5 |      |   57   |   MMMMM  |
                  | 99  |     42 |      |   58   |   NNNNN  |
                  | 100 |     75 |      |   59   |   OOOOO  |
                  +-----+--------+      |   75   |   PPPPP  |
                                        |   88   |   QQQQQ  |
                                        |   89   |   RRRRR  |
                                        |   90   |   SSSSS  |
                                        |   91   |   TTTTT  |
                                        |   92   |   UUUUU  |
                                        |   93   |   VVVVV  |
                                        |   94   |   WWWWW  |
                                        |   95   |   XXXXX  |
                                        |   96   |   YYYYY  |
                                        |   97   |   ZZZZZ  |
                                        +--------+----------+

我想得到:

Result 1:
+-----+--------+----------+-------------+
| cid | cat_id | cat_name | Total_Click | Total_Click = count(cid) from table A
+-----+--------+----------+-------------+
| 33  |   6    |  FFFFF   |   5         |
| 33  |   20   |  IIIII   |   5         |
| 33  |   59   |  OOOOO   |   5         |
| 33  |   88   |  QQQQQ   |   5         |
| 86  |   1    |  AAAAA   |   2         |
| 86  |   14   |  HHHHH   |   2         |
| 86  |   45   |  KKKKK   |   2         |
| 86  |   57   |  MMMMM   |   2         |
| 86  |   59   |  OOOOO   |   2         |
| 86  |   94   |  WWWWW   |   2         |
| 99  |   42   |  JJJJJ   |   1         |
| 100 |   75   |  PPPPP   |   1         |
+-----+--------+----------+-------------+

最后,我想知道每个类别获得的点击次数。

Result 2:
+----------+-------------+
| cat_name | Total_Click |
+----------+-------------+
|  AAAAA   |   2         |
|  BBBBB   |   0         |
|  CCCCC   |   0         |
|  DDDDD   |   0         |
|  EEEEE   |   0         |
|  FFFFF   |   5         |
|  GGGGG   |   0         |
|  HHHHH   |   2         |
|  IIIII   |   5         |
|  JJJJJ   |   1         |
|  KKKKK   |   2         |
|  LLLLL   |   0         |
|  MMMMM   |   2         |
|  NNNNN   |   0         |
|  OOOOO   |   7         |
|  PPPPP   |   1         |
|  QQQQQ   |   5         |
|  RRRRR   |   0         |
|  SSSSS   |   0         |
|  TTTTT   |   0         |
|  UUUUU   |   0         |
|  VVVVV   |   0         |
|  WWWWW   |   2         |
|  XXXXX   |   0         |
|  YYYYY   |   0         |
|  ZZZZZ   |   0         |
+----------+-------------+

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以通过JOIN

获得第一个结果
SELECT a.cid, b.cat_id, c.cat_name, COUNT(a.id) as Click
FROM Table_c c
    JOIN Table_b b ON c.cat_id = b.cat_id
    JOIN Table_a a ON a.cid = b.cid
GROUP BY c.cat_name, a.cid, b.cat_id

针对您的第二个结果尝试以下查询

SELECT c.cat_name, IFNULL(COUNT(a.id), 0) as Total_Click
FROM Table_c c
    LEFT OUTER JOIN Table_b b ON c.cat_id = b.cat_id
    LEFT OUTER JOIN Table_a a ON a.cid = b.cid
GROUP BY c.cat_name