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

14

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) 的双重执行?子查询的结果总是返回一个有效的散列值。重要的是,主查询的结果也包括散列值。
我首先尝试了这样一个 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个回答

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

谢谢。这个查询总是返回哈希值,对吗?但它并没有计算所有具有相同哈希值的其他条目。 - The Bndr
5
欢迎!现在请将我的回答标记为已接受,这样我就可以获得额外的“15”个声望点数,这会稍微增强我的自尊心。 - Quassnoi

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 是你的子查询,一旦它被嵌套,你就可以在外部查询中通过它的别名引用它。虽然这使得查询变得有点大,但我认为这不是什么大问题。


0

如果我理解你想要的是什么,查询应该是这样的:

select count(case xd when 2 then 1 else null end case), hash from sets where id = 1 group by hash

好主意,但是如果xd!=2的话就不起作用了。在这种情况下,结果是空的,但我需要哈希值作为结果的一部分。 - The Bndr

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;

不幸的是,如果XD=2不匹配,这也会返回HASH=NULL :-( - The Bndr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接