Присоединяется и где условия

У меня такой (сокращенный запрос):

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, но не знаю, как добавить это в запрос. Есть идеи?

Спасибо,

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
224
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Используйте HAVING COUNT(DISTINCT Flags.FlagType) = 0.

Ах, это работает только с = 0 - есть ли способ заставить его работать, например, с <= 3?

Ross 23.11.2008 14:56

Попробуй это:

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.)»

ysth 23.11.2008 18:18
Ответ принят как подходящий

Может быть, вы можете попробовать подзапрос, если 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 флага. Я поиграю с этим.

Ross 23.11.2008 16:21

Я удалил GROUP BY в подвыборке и изменил IN на NOT IN, и, похоже, он работает. Основная причина, по которой HAVING не работает, заключается в том, что он, похоже, не поддерживает значения gt / lt (или я делаю что-то странное). Однако HAVING должен работать в большинстве случаев.

Ross 23.11.2008 16:24

Другие вопросы по теме