我的查询选择与用户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。如果我所说的需要澄清,请询问!再次感谢您的帮助!
答案 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'
)