У меня такой (сокращенный запрос):
SELECT
`Statistics`.`StatisticID`,
COUNT(DISTINCT `Flags`.`FlagType`) AS `FlagCount`
FROM `Statistics`
LEFT JOIN `Flags` ON `Statistics`.`StatisticID` = `Flags`.`StatisticID`
WHERE `FlagCount` = 0
GROUP BY `Statistics`.`StatisticID`
ORDER BY `SubmittedTime` DESC
LIMIT 0, 10
Теперь ни FlagCount = 0, ни COUNT(Flags.FlagType) не работают в пункте WHERE. Я думал об использовании SET, но не знаю, как добавить это в запрос. Есть идеи?
Спасибо,






Попробуй это:
SELECT
`Statistics`.`StatisticID`,
COUNT(DISTINCT `Flags`.`FlagType`) AS `FlagCount`
FROM `Statistics`
LEFT JOIN `Flags` ON `Statistics`.`StatisticID` = `Flags`.`StatisticID`
And `FlagCount` = 0
GROUP BY `Statistics`.`StatisticID`
ORDER BY `SubmittedTime` DESC
LIMIT 0, 10
@ eed3si9n
Это частично работает, но мне нужно, чтобы он был <= 3, что, похоже, не работает.
Кроме того, предложение HAVING выполняется последним, что не вернет столько результатов, сколько мне нужно (как установлено LIMIT). Есть ли способ сделать это вместо этого в предложении WHERE?
Пожалуйста, покажите, что именно вы пробовали, и скажите, что это не работает. dev.mysql.com/doc/refman/5.0/en/select.html: «Предложение HAVING применяется почти последним, непосредственно перед отправкой элементов клиенту, без оптимизации. (LIMIT применяется после HAVING.)»
Может быть, вы можете попробовать подзапрос, если HAVING не работает.
SELECT
`Statistics`.`StatisticID`,
COUNT(DISTINCT `Flags`.`FlagType`) AS `FlagCount`
FROM `Statistics`
LEFT JOIN `Flags` ON `Statistics`.`StatisticID` = `Flags`.`StatisticID`
WHERE `Statistics`.`StatisticID`
IN (SELECT `Flags`.`StatisticID`
FROM `Flags`
HAVING COUNT(DISTINCT `Flags`.`FlagType`) <= 3
GROUP BY `Flags`.`StatisticID`
)
GROUP BY `Statistics`.`StatisticID`
ORDER BY `SubmittedTime` DESC
LIMIT 0, 10
Я думаю, что это правильный подход - за исключением того, что он возвращает результат, который имеет только больше или 3 флага. Я поиграю с этим.
Я удалил GROUP BY в подвыборке и изменил IN на NOT IN, и, похоже, он работает. Основная причина, по которой HAVING не работает, заключается в том, что он, похоже, не поддерживает значения gt / lt (или я делаю что-то странное). Однако HAVING должен работать в большинстве случаев.
Ах, это работает только с = 0 - есть ли способ заставить его работать, например, с <= 3?