【问题标题】:MySQL UNION COUNTMySQL 联合计数
【发布时间】:2013-02-07 04:49:49
【问题描述】:

首先让我展示我的表格数据,然后我将解释我的问题。

MySQL 表结构

CREATE TABLE more_tags (
tag_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
more_id INT UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
tag_name VARCHAR(255) NOT NULL,
PRIMARY KEY (tag_id),
UNIQUE KEY (more_id, user_id, tag_name)
);

CREATE TABLE tags(
tag_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
another_id INT UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
tag_name VARCHAR(255) NOT NULL,
PRIMARY KEY (tag_id),
UNIQUE KEY (another_id, user_id, tag_name)
);

more_tads 表数据

tag_id  tag_name
10      apple 
192     apple 
197     apple 
203     apple 
207     apple 
217     news 
190     bff
196     cape

标记表数据

tag_id  tag_name
1       apple 
2       time 
3       bff

好的,我之前问了一些类似的问题。但现在由于某种原因,我无法让查询计算两个表中的标签,它只计算一个表中的标签,如下例所示

当前输出

tag_id  tag_name    num
1       apple       5
2       bff         1
3       cape        1
4       time        1

但我想对所有相似的标签进行分组,并计算它们在表格中出现的次数,如下例所示

期望的输出

tag_id  tag_name    num
1       apple       6
2       bff         2
3       cape        1
4       time        1

当前 MySQL QUERY

SELECT *
FROM(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 
AND `users`.`deletion` = '0' 
GROUP BY `more_tags`.`tag_name`
UNION(
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 
AND `users`.`deletion` = '0' 
GROUP BY `tags`.`tag_name`))
AS table_1 
GROUP BY `tag_name`  
ORDER BY `tag_name` ASC

【问题讨论】:

  • 您可以在删除第二个括号的() 后尝试吗?
  • @Bhavik Shah,没有人还在努力寻找解决方案。

标签: mysql count group-by union


【解决方案1】:

这将输出你想要的结果。只需在子查询中添加用户联接。

SELECT a.tag_id, a.tag_name, SUM(a.num)
FROM (
     SELECT tag_id, tag_name, SUM(1) as num  FROM tags
        GROUP BY tag_name
     UNION
     SELECT tag_id, tag_name, SUM(1) as num  FROM more_tags
        GROUP BY tag_name
      ) a
GROUP BY a.tag_name

【讨论】:

    【解决方案2】:

    你想要的输出中的 tag_id 对我来说真的没有意义。没有它,您将如何获得您的要求:

    SELECT tag_name, SUM(num)
    FROM(SELECT `more_tags`.`tag_name`, COUNT(*) as 'num' 
    FROM `more_tags` 
    INNER JOIN `users` ON `more_tags`.`user_id` = `users`.`user_id` 
    WHERE `users`.`active` IS NULL 
    AND `users`.`deletion` = '0' 
    GROUP BY `more_tags`.`tag_name`
    UNION ALL
    SELECT `tags`.`tag_name`, COUNT(*) as 'num' 
    FROM `tags` 
    INNER JOIN `users` ON `tags`.`user_id` = `users`.`user_id` 
    WHERE `users`.`active` IS NULL 
    AND `users`.`deletion` = '0' 
    GROUP BY `tags`.`tag_name`)
    AS table_1 
    GROUP BY `tag_name`  
    ORDER BY `tag_name` ASC
    

    删除用户逻辑的SQL Fiddle演示关键点:http://sqlfiddle.com/#!2/ea44d/2

    另外,不要忘记 UNION ALLSUM,它们是您问题中缺少的关键部分。如果没有 UNION ALL,当某些行不在我在小提琴中给出的示例中时,它们可能会被拒绝为重复行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多