SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.09.2010 11:58:18

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Разобраться с order by count

Ребята, привет всем!

Не могли бы вы мне подсказать как работает order by count?

Имеется таблица:

mysql> select * from test;
+----+------+
| id | text |
+----+------+
|  1 | a    |
|  2 | b    |
|  1 | c    |
|  2 | d    |
|  3 | f    |
|  3 | g    |
|  3 | h    |
+----+------+

После выборки запросом ожидаю видеть что-то вроде:
+----+------+
| id | text |
+----+------+
|  3 | f    |
|  3 | g    |
|  3 | h    |
|  1 | a    |
|  1 | c    |
|  2 | b    |
|  2 | d    |
+----+------+

То есть id со значениями равными 3 сверху, т.к. их больше.

Запрос1:
mysql> select * from test order by count(id);
+----+------+
| id | text |
+----+------+
|  1 | a    |
+----+------+

Запрос2:
mysql> select test.*, count(id) as total from test order by total;
+----+------+-------+
| id | text | total |
+----+------+-------+
|  1 | a    |     7 |
+----+------+-------+

Как пользоваться order by count hmm? Заранее спасибо!

Отредактированно FiMko (23.09.2010 11:59:25)

Неактивен

 

#2 23.09.2010 12:35:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5847

Re: Разобраться с order by count

select test.* from test join
(select id,count(id) as total from test group by id) t
using(id) order by total desc, id;


FiMko написал:

Запрос2:
[syntax=mysql]mysql> select test.*, count(id) as total from test order by total;

А какая у вас версия. По идее должен послать:
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Неактивен

 

#3 23.09.2010 12:51:27

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Разобраться с order by count

vasya написал:

select test.* from test join
(select id,count(id) as total from test group by id) t
using(id) order by total desc, id;

Ммм... так многословно, но большое Вам спасибо!

vasya написал:

А какая у вас версия. По идее должен послать:
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

mysql> select version();
+---------------------+
| version()           |
+---------------------+
| 5.0.84-community-nt |
+---------------------+

Неактивен

 

#4 28.09.2010 16:40:19

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Разобраться с order by count

vasya написал:

select test.* from test join
(select id,count(id) as total from test group by id) t
using(id) order by total desc, id;

Я упустил самое главное!
Что делать, если таблицы test нет, а ее содержимое - это результат, возвращенный вложенным запросом?
Там очень большой набор возвращается в результате работы большого количества вложенных запросов.
Выполняется за один раз, очень не хочется как-то переделывать через временные таблицы.

То есть сложилась примерно вот такая ситуация:


select ВСЕ_ТА_ЖЕ_ТАБЛИЦА_TMP.* from ВСЕ_ТА_ЖЕ_ТАБЛИЦА_TMP join (
    select id, count(id) as total from (select * from test) TMP group by id
) t using(id) order by total desc, id;
 
----
добавлено:

Да, собственно и со временными таблицами не получится ничего.  Даже если бы я этого хотел.
Ведь временная таблица может быть использована в рамках запроса только один раз...

CREATE TEMPORARY TABLE IF NOT EXISTS tmp (
    id int(11),
    text varchar(30)
);

insert into tmp (select * from test);

select tmp.* from tmp join (
    select id, count(id) as total from tmp group by id
) t using(id) order by total desc;
ERROR 1137 (HY000): Can't reopen table: 'tmp'

Отредактированно FiMko (29.09.2010 10:41:04)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson