ВЫБЕРИТЕ COUNT (DISTINCT name), id, адрес от пользователей - PullRequest
0 голосов
/ 27 ноября 2009

В PHP я пытаюсь запустить SQL-запрос и выбрать обычные столбцы, а также COUNT.

$sql_str =  "select COUNT(DISTINCT name), id, adress from users";
$src = mysql_query($sql_str);

while( $dsatz = mysql_fetch_assoc($src) ){
    echo $dsatz['name'] . "<br>";
}

Проблема в том, что когда в моем запросе указано "COUNT (DISTINCT name)", он вернет только первую запись. Когда я удалю его, он вернет все соответствующие записи из базы данных.

Я мог бы разделить его и выполнить 2 запроса, но я пытаюсь избежать этого из-за проблем с производительностью.

Что я делаю не так? thx, Mexx

Ответы [ 6 ]

4 голосов
/ 27 ноября 2009

Возможность смешивать обычные столбцы и агрегатные функции является (неправильной) функцией MySQL. Вы даже можете прочитать, почему это так опасно в документации MySQL: https://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html

Но если вы действительно хотите смешать обычные строки и сводку в одном запросе, вы всегда можете использовать оператор UNION:

SELECT COUNT(DISTINCT name), null, null FROM users GROUP BY name --summary row
UNION
SELECT name, id, address FROM users --normal rows
1 голос
/ 27 ноября 2009

COUNT() - это агрегатная функция, которая агрегирует результаты остальных запросов. Если вы хотите сосчитать все отдельные имена, а не только отдельные имена, связанные с выбранными вами id и address, то да, вам придется выполнить два запроса. Вот так работает SQL.

Обратите внимание, что при агрегировании также должно быть предложение group by. Я думаю, что тот факт, что MySQL не требует этого, ужасен, и он поощряет действительно вредные привычки.

0 голосов
/ 27 ноября 2009

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

Попробуйте

  select name, id, address, count(id) as total_number 
    from users 
    group by name, id, address;
0 голосов
/ 27 ноября 2009
select count(distinct name), id, adress 
from users 
group by id, adress
0 голосов
/ 27 ноября 2009

Если у вас есть count () как часть списка полей, вы должны сгруппировать остальные поля. В вашем случае это будет

select count(distinct name), id, adress from users group by id, adress
0 голосов
/ 27 ноября 2009

Из того, что я понимаю, вы хотите получить:

  • одна строка на пользователя, чтобы получить каждое имя / идентификатор / адрес
  • одна строка для нескольких пользователей одновременно, чтобы получить количество пользователей с одинаковым именем.

Это не совсем возможно, я бы сказал.


Решением было бы, как вы сказали, два запроса ...

... Или, в вашем случае, вы могли бы подсчитать со стороны PHP, я полагаю.
т.е. не считать в запросе, но использовать дополнительный цикл в вашем PHP-коде.

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