Как использовать результат подзапроса несколько раз в запросе - PullRequest
5 голосов
/ 20 апреля 2011

Для запроса 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 ]

2 голосов
/ 20 апреля 2011
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 голос
/ 20 апреля 2011

Я обычно вкладываю операторы, подобные следующему

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 голосов
/ 20 апреля 2011

Я согласен с другими ответами, что 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;
0 голосов
/ 20 апреля 2011

Если я правильно понимаю, что вы пытаетесь получить, запрос должен выглядеть так:

select count(case xd when 2 then 1 else null end case), hash from sets where id = 1 group by hash
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...