获取多个子查询结果的SUM

时间:2016-03-26 01:15:53

标签: mysql sql

我的查询选择与用户ID匹配的所有标签,然后为每个标签检查另一个特定用户是否具有相同的标签(用户有多个标签)。这是我现在拥有的:

SELECT name as tname,
(
SELECT COUNT(*) FROM tags WHERE tags.name = tname AND user_id = '101'
) as count
FROM tags
WHERE user_id = '102'

输出是一个标签列表,如果匹配则“count”为1,如果没有匹配则为0。它看起来像这样:

+--------+-------+
| tname  | count |
+--------+-------+
| Apple  |     1 |
| Banana |     1 |
| Orange |     1 |
| Peach  |     0 |
| Pear   |     1 |
+--------+-------+

所有信息都在那里,但我希望获得所有匹配的总和(在这种情况下,它将是4)。然后我将在另一个查询中使用所有这些,以便我可以得到这样的查询:

SELECT sum( count ) as total_count, class FROM table where count > 3 GROUP BY class

任何帮助都非常感谢!

更新

我最终使用以下查询来获得4的总和:

SELECT SUM(count) as count
FROM (
     SELECT name as tname,
     (
     SELECT COUNT(*) FROM tags WHERE tags.name = tname AND user_id = '101'
     ) as count
     FROM tags
     WHERE user_id = '102'
     ) as t

这很棒,但这只是我想要实现的前半部分。我仍然无法在另一个查询中包装此计数查询(最终得到所有用户ID和相应计数的列表)。我最后使用了Hang的答案,因为它对我当前的查询进行了很少的更改,而且我找不到使用Gordon Linoff的答案获得相同结果的方法(由于我缺乏理解)。我想要的结果看起来像这样:

+--------+-------+
| id     | count |
+--------+-------+
| 102    |     4 |
| 103    |     3 |
| 104    |     7 |
| 105    |     2 |
| 106    |     4 |
+--------+-------+

我想'SELECT id FROM users',并且对于每个用户,使用更新的子查询获取计数,将'102'替换为每个用户的id。如果我所说的需要澄清,请询问!再次感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您需要用户101具有的用户102具有的标签数量。您可以使用join

执行此操作
select count(*)
from tags t101 join
     tags t102
     on t101.tag = t102.tag and
        t101.user_id = 101 and
        t102.user_id = 102;

这假设表中没有重复项。如果有,请使用select count(distinct t101.tag)

顺便说一句,您可以使用相同查询的轻微变体来获取匹配的标记:

select t101.tag, count(t102.user_id)
from tags t101 left join
     tags t102
     on t101.tag = t102.tag and
        t102.user_id = 102
where t101.user_id = 101
group by t101.tag;

答案 1 :(得分:0)

在查询之外包装SELECT,如下所示:

SELECT SUM(count)
FROM (
     SELECT name as tname,
     (
     SELECT COUNT(*) FROM tags WHERE tags.name = tname AND user_id = '101'
     ) as count
     FROM tags
     WHERE user_id = '102'
     )