MySQL Выбор нескольких полей одним запросом, использующим COUNT (*) - PullRequest
1 голос
/ 29 мая 2020

У меня есть сомнения по поводу mysql запроса. Поверьте, я много гуглил перед тем, как приехать, и даже искал SO, но не нашел точно ответа, который искал. Мой вопрос: считается ли следующее утверждение правильным, поскольку я подсчитываю строки, плюс также извлекаю значения из разных полей?

SELECT COUNT(*) as cnt, otp_code, otp_validity
FROM otp
WHERE otp_mem = :mem

Или при использовании COUNT(*) не следует ли мне извлекать другое поле значения в одном запросе? Это действующая практика?

1 Ответ

3 голосов
/ 29 мая 2020

Этот запрос:

SELECT COUNT(*) as cnt, otp_code, otp_validity
FROM otp
WHERE otp_mem = :mem

Почему? Ваш запрос является запросом агрегирования, потому что он имеет COUNT(*). Но otp_code и otp_validity находятся в SELECT, но не в GROUP BY.

Предположительно, вы намереваетесь выполнить следующее:

SELECT COUNT(*) as cnt, otp_code, otp_validity
FROM otp
WHERE otp_mem = :mem
GROUP BY otp_code, otp_validity;

Это возвращает одну строку для каждой пары otp_code / otp_validity с подсчетом для этой пары.

Или:

SELECT COUNT(*) OVER () as cnt, otp_code, otp_validity
FROM otp
WHERE otp_mem = :mem;

Это возвращает каждую строку с общим количеством строк, возвращенных запросом.

Или:

SELECT COUNT(*) as cnt, MIN(otp_code), MIN(otp_validity)
FROM otp
WHERE otp_mem = :mem
GROUP BY otp_code, otp_validity;

Это возвращает одну строку с образцом значения из других столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...