Отфильтруйте инструкцию SELECT SQL-запроса, используя HAVING

Я создал оператор выбора, который объединяет данные из трех таблиц базы данных. Вот исходные данные из трех таблиц:

Таблица 1:

идентификатор имя 1 Группа 1 2 Группа 2 3 Группа 3 4 Группа 4

Таблица 2:

идентификатор идентификатор группы ограничение 1 1 4 2 2 10 3 3 2 4 4 3

Таблица 3:

идентификатор ID пользователя идентификатор группы 1 459 4 2 521 4 3 487 4 4 121 3 5 778 4 6 123 4 7 488 4 8 74 4 9 663 4 10 741 4 11 56 3 12 222 3 13 632 4 14 115 4 15 447 4

Вот SQL-запрос:

SELECT name as "Group name", limit as "Membership limit", 
(SELECT count(userid) FROM Table3 WHERE Table3.groupid = Table1.id) as "Current number of members" 
FROM Table1 
INNER JOIN Table2 
ON Table2.groupid = Table1.id 
ORDER BY name

Приведенный выше запрос правильно выводит данные следующим образом:

Таблица результатов SQL-запроса

Однако я хочу отфильтровать результаты этого запроса, чтобы в таблице отображались только строки, в которых «Текущее количество участников» больше, чем «Предел членства». В этом случае он должен отображать только группу с именем «Группа 3», в которой есть 3 текущих члена, когда ограничение на членство составляет всего 2.

Я попытался включить оператор GROUP BY вместе с оператором HAVING следующим образом:

SELECT name as "Group name", limit as "Membership limit", 
(SELECT count(userid) FROM Table3 WHERE Table3.groupid = Table1.id) as "Current group members"
FROM Table1
INNER JOIN Table2
ON Table2.groupid = Table1.id
GROUP BY Table1.id, Table2.limit
HAVING "Current group members" > "Membership limit"
ORDER BY name

Это не вызывает никаких ошибок, когда я запускаю запрос, но он не возвращает данных (вместо того, чтобы возвращать значения для группы 3).

Я уверен, что делаю что-то не так, что будет очевидно для других людей, и я был бы признателен за ваш экспертный совет!

Возможно, у кого-то здесь будет прямое представление о том, как исправить ваш запрос, но я думаю, что действительно сложно ответить на ваш вопрос, не видя никаких входных данных и ожидаемого результата. Пожалуйста, прочитайте и следуйте stackoverflow.com/help/minimal-reproducible-example

Jonas Metzler 03.02.2023 11:38

Какие СУБД вы используете? (Я ожидал другой ошибки...)

jarlh 03.02.2023 11:42

@JonasMetzler, спасибо за ваш комментарий. Я обновил свой пост сейчас, чтобы включить исходные данные. Исходный запрос работает правильно, используя эти исходные данные. Это просто та часть, когда мне нужно отфильтровать результирующую таблицу, с которой у меня возникают проблемы.

Veronica Swift 03.02.2023 14:27

@jarlh, я только что проверил запрос в PHPmyadmin. Вот и появилось это предупреждение.

Veronica Swift 03.02.2023 14:27

Еще раз привет @jarlh, это предупреждение не появляется сейчас, когда я использую псевдоним «Лимит членства» в заявлении HAVING, поэтому я обновил свой пост, чтобы упростить свой вопрос. Но он по-прежнему не возвращает никаких данных вместо того, чтобы возвращать данные группы 3. Я не уверен, почему.

Veronica Swift 03.02.2023 14:39

@VeronicaSwift, я никогда раньше этого не замечал, но похоже, что MySQL имеет непоследовательное значение двойных кавычек. dbfiddle.uk/n564KGoG

jarlh 04.02.2023 10:01
Освоение архитектуры микросервисов с 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
6
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Оберните свой запрос в производную таблицу (подзапрос). Затем проверьте количество возвращаемых пользователей:

select "Group name", "Membership limit", "Current group members"
from
(
    SELECT name as "Group name", limit as "Membership limit",
           (SELECT count(userid) FROM Table3
            WHERE Table3.groupid = Table1.id) as "Current group members"
    FROM Table1
    INNER JOIN Table2
      ON Table2.groupid = Table1.id
) dt
where "Current group members" > "Membership limit"

Спасибо за ваше предложение @jarlh. К сожалению, этот запрос по-прежнему не возвращает ни одной строки данных, хотя он должен возвращать: |Группа 3 | 2 | 3 |

Veronica Swift 03.02.2023 15:30

Что произойдет, если вы пропустите предложение WHERE на некоторое время?

jarlh 03.02.2023 15:46

Спасибо, @jarlh. Когда я использую ваш производный код таблицы и удаляю последнее предложение WHERE, он возвращает таблицу с тремя столбцами (имя группы | лимит членства | текущие члены группы). В таблице 8 строк, и все 8 ячеек в столбце «Имя группы» содержат текст «Имя группы»; все 8 ячеек в столбце «Лимит членства» содержат текст «Лимит членства»; и все 8 ячеек в столбце «Текущие участники группы» содержат текст «Текущие участники группы». Ни одна из ячеек не содержит чисел.

Veronica Swift 03.02.2023 15:53

Какие СУБД вы используете? Двойные кавычки — это стандартный символ SQL для обозначения идентификаторов в кавычках, но, к сожалению, некоторые продукты используют их в качестве разделителей строк.

jarlh 03.02.2023 16:06

На сервере работает MySQL в Linux, и я использую phpMyAdmin для тестирования запросов. Двойные кавычки отлично работают в других запросах, которые я запускал на этом сервере. И как показано на изображении в моем посте выше, мой исходный код (до того, как я попытался отфильтровать список дальше) отлично работал с двойными кавычками. Так что я не думаю, что проблема в двойных кавычках. Есть ли у вас другие предложения?

Veronica Swift 03.02.2023 17:12

MySQL хочет использовать обратные кавычки вместо двойных кавычек.

jarlh 03.02.2023 23:48

Большое спасибо @jarlh, это помогло! Хотя мне просто интересно…. двойные кавычки отлично работали в моем запросе выше (который просто представляет данные в трех столбцах без их фильтрации). Так почему же двойные кавычки должны заменяться обратными кавычками, когда мы вводим производную таблицу?

Veronica Swift 04.02.2023 02:10

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