Я создал оператор выбора, который объединяет данные из трех таблиц базы данных. Вот исходные данные из трех таблиц:
Таблица 1:
Таблица 2:
Таблица 3:
Вот 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).
Я уверен, что делаю что-то не так, что будет очевидно для других людей, и я был бы признателен за ваш экспертный совет!
Какие СУБД вы используете? (Я ожидал другой ошибки...)
@JonasMetzler, спасибо за ваш комментарий. Я обновил свой пост сейчас, чтобы включить исходные данные. Исходный запрос работает правильно, используя эти исходные данные. Это просто та часть, когда мне нужно отфильтровать результирующую таблицу, с которой у меня возникают проблемы.
@jarlh, я только что проверил запрос в PHPmyadmin. Вот и появилось это предупреждение.
Еще раз привет @jarlh, это предупреждение не появляется сейчас, когда я использую псевдоним «Лимит членства» в заявлении HAVING, поэтому я обновил свой пост, чтобы упростить свой вопрос. Но он по-прежнему не возвращает никаких данных вместо того, чтобы возвращать данные группы 3. Я не уверен, почему.
@VeronicaSwift, я никогда раньше этого не замечал, но похоже, что MySQL имеет непоследовательное значение двойных кавычек. dbfiddle.uk/n564KGoG






Оберните свой запрос в производную таблицу (подзапрос). Затем проверьте количество возвращаемых пользователей:
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 |
Что произойдет, если вы пропустите предложение WHERE на некоторое время?
Спасибо, @jarlh. Когда я использую ваш производный код таблицы и удаляю последнее предложение WHERE, он возвращает таблицу с тремя столбцами (имя группы | лимит членства | текущие члены группы). В таблице 8 строк, и все 8 ячеек в столбце «Имя группы» содержат текст «Имя группы»; все 8 ячеек в столбце «Лимит членства» содержат текст «Лимит членства»; и все 8 ячеек в столбце «Текущие участники группы» содержат текст «Текущие участники группы». Ни одна из ячеек не содержит чисел.
Какие СУБД вы используете? Двойные кавычки — это стандартный символ SQL для обозначения идентификаторов в кавычках, но, к сожалению, некоторые продукты используют их в качестве разделителей строк.
На сервере работает MySQL в Linux, и я использую phpMyAdmin для тестирования запросов. Двойные кавычки отлично работают в других запросах, которые я запускал на этом сервере. И как показано на изображении в моем посте выше, мой исходный код (до того, как я попытался отфильтровать список дальше) отлично работал с двойными кавычками. Так что я не думаю, что проблема в двойных кавычках. Есть ли у вас другие предложения?
MySQL хочет использовать обратные кавычки вместо двойных кавычек.
Большое спасибо @jarlh, это помогло! Хотя мне просто интересно…. двойные кавычки отлично работали в моем запросе выше (который просто представляет данные в трех столбцах без их фильтрации). Так почему же двойные кавычки должны заменяться обратными кавычками, когда мы вводим производную таблицу?
Возможно, у кого-то здесь будет прямое представление о том, как исправить ваш запрос, но я думаю, что действительно сложно ответить на ваш вопрос, не видя никаких входных данных и ожидаемого результата. Пожалуйста, прочитайте и следуйте stackoverflow.com/help/minimal-reproducible-example