MySQL查询需要不同位置的子查询结果,如下所示:
SELECT COUNT(*),(SELECT hash FROM sets WHERE ID=1)
FROM sets
WHERE hash=(SELECT hash FROM sets WHERE ID=1)
and XD=2;
有没有办法避免子查询(SELECT hash FROM sets WHERE ID=1)
的双重执行?
子查询的结果始终返回有效的哈希值。
重要的是主查询的结果还包括HASH。
首先我尝试了这样的JOIN
:
SELECT COUNT(*), m.hash FROM sets s INNER JOIN sets AS m
WHERE s.hash=m.hash AND id=1 AND xd=2;
如果XD = 2与行不匹配,则结果为:
+----------+------+
| count(*) | HASH |
+----------+------+
| 0 | NULL |
+----------+------+
而不是(我需要的):
+----------+------+
| count(*) | HASH |
+----------+------+
| 0 | 8115e|
+----------+------+
有什么想法吗?请告诉我!提前感谢您的帮助。
//编辑: 最后,该查询只需计算表中具有相同散列值的所有条目,如ID = 1且XD = 2的条目。如果没有行匹配(如果XD设置为其他数字则发生这种情况),所以返回0并简单地哈希值。
答案 0 :(得分:2)
SELECT SUM(xd = 2), hash
FROM sets
WHERE id = 1
如果id
是PRIMARY KEY
(我认为是因为您正在使用针对它的单记录查询),那么您可以放弃SUM
:
SELECT xd = 2 AS cnt, hash
FROM sets
WHERE id = 1
<强>更新强>
抱歉,你的任务错了。
试试这个:
SELECT si.hash, COUNT(so.hash)
FROM sets si
LEFT JOIN
sets so
ON so.hash = si.hash
AND so.xd = 2
WHERE si.id = 1
答案 1 :(得分:1)
我通常将语句嵌套如下
SELECT Count(ResultA.Hash2) AS Hash2Count,
ResultA.Hash1
FROM (SELECT S.Hash AS Hash2,
(SELECT s2.hash
FROM sets AS s2
WHERE s2.ID = 1) AS Hash1
FROM sets AS S
WHERE S.XD = 2) AS ResultA
WHERE ResultA.Hash2 = ResultA.Hash1
GROUP BY ResultA.Hash1
(这是手动打字而未经过测试,但你应该明白这一点) Hash1是您的子查询,一旦嵌套,您可以通过外部查询中的别名引用它。它使查询变得更大,但我不认为它是一个巨大的。
答案 2 :(得分:0)
如果我理解你想要获得的内容,查询应如下所示:
select count(case xd when 2 then 1 else null end case), hash from sets where id = 1 group by hash
答案 3 :(得分:0)
我同意其他答案,即GROUP BY可能更好,但回答提出的问题,这里是如何消除重复:
SELECT COUNT(*), h.hash
FROM sets, (SELECT hash FROM sets WHERE ID=1) h
WHERE sets.hash=h.hash
and sets.ID=1 and sets.XD=2;