如何在查询中多次使用子查询的结果

时间:2011-04-20 13:22:32

标签: mysql sql subquery

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并简单地哈希值。

4 个答案:

答案 0 :(得分:2)

SELECT  SUM(xd = 2), hash
FROM    sets
WHERE   id = 1

如果idPRIMARY 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;