MySQL GROUP& COUNT个多个表

时间:2013-02-06 18:36:39

标签: mysql count group-by multiple-tables

我有一个3部分问题一直给我带来麻烦我知道如果我查询1个表如何让表工作 一次但我似乎无法弄清楚如何将tagsmore_tags表结合起来以获得相同的结果。

我遇到的3个主要问题如下。

问题1

我希望能够从tagsmore_tags表中对相同的标记进行分组。

问题2

我还希望能够显示每个表中不存在于另一个表中的标记。

问题3

我还想计算代码在tagsmore_tags表格中显示的总次数。

MYSQL表

SELECT `tags`.`tag_id`, `tags`.`tag_name`, COUNT(`tags`.`tag_name`) as 'num' 
FROM `tags` 
INNER JOIN `users` ON `tags`.`user_id` = `users`.`user_id` 
WHERE `users`.`active` IS NULL
GROUP BY `tags`.`tag_name` 
ORDER BY `tags`.`tag_name` ASC";


SELECT `more_tags`.`tag_id`, `more_tags`.`tag_name`, COUNT(`more_tags`.`tag_name`) as 'num' 
FROM `more_tags` 
INNER JOIN `users` ON `more_tags`.`user_id` = `users`.`user_id` 
WHERE `users`.`active` IS NULL
GROUP BY `more_tags`.`tag_name` 
ORDER BY `more_tags`.`tag_name` ASC";             

所需的输出

tag_id  tag_name    num
10  apple   12
192     pear    1
197     bored   1
203     sad     3
207     ads     2
217     news    1
190     bf  1
196     cape    1

2 个答案:

答案 0 :(得分:4)

问题1:

SELECT tag_id, tag_name, count(*)
FROM (
  SELECT tag_id, tag_name FROM tags
  UNION ALL
  SELECT tag_id, tag_name FROM more_tags
) s
GROUP BY tag_id, tag_name

问题2:

SELECT tag_id, tag_name, 'not present in more tags' as description
FROM tags LEFT JOIN more_tags ON tags.tag_id=more_tags.tag_id
WHERE more_tags.tag_id IS NULL
UNION ALL
SELECT tag_id, tag_name, 'not present in tags' as description
FROM tags RIGHT JOIN more_tags ON tags.tag_id=more_tags.tag_id
WHERE tags.tag_id IS NULL

问题3:

SELECT tag_id, tag_name, COUNT(*)
FROM tags INNER JOIN more_tags ON tags.tag_id=more_tags.tag_id
GROUP BY tag_id, tag_name

答案 1 :(得分:1)

如果这些查询返回具有相同结构的行(也就是说,如果第一个查询中的第一列是int,那么第二个查询中的第一列必须使用),您可以使用UNION将两个查询中的结果集添加到一起是一个int,等等)。在http://dev.mysql.com/doc/refman/5.1/en/union.html

中阅读所有相关内容

一旦你编写了两个选择并用UNION语句加入它们,就可以将它用作GROUP BY或其他东西的子查询:

SELECT * FROM (
(SELECT 1 AS ticked, col1, col2 FROM table1 INNER JOIN table2 USING (col3))
    UNION
(SELECT 0 AS ticked, col1, col2 FROM table1)
) AS combined_table /*derived tables need a unique name*/
GROUP BY col1 /*group by the unique col1 to stop duplicates*/
ORDER BY ticked DESC