Сортировка таблицы тегов MYSQL - PullRequest
2 голосов
/ 07 сентября 2010

просто интересно, можно ли получить 10 лучших результатов COUNT и упорядочить по COUNT и по алфавиту?

У меня есть следующие таблицы,

tags
-------
id | title

.

tagged
------
tag_id | post_id

И следующий SQL-запрос

SELECT tag.*, COUNT(td.tag_ID) AS tagcount
FROM Tagged td
LEFT JOIN Tags tag ON td.tag_ID = tag.tag_ID
GROUP BY td.tag_ID
ORDER BY tagcount DESC, tag.tag_Title ASC

Есть идеи?

Заранее спасибо


Редактировать

Извините, если я не объяснил это должным образом.

Запрос работает, и я не добавил LIMIT 10 из-за желания сначала просмотреть весь набор результатов.

Запрос, который я имею, работает нарезультат следующего примера

tag_ID  tag_Title  tagcount
1          Science  3
3          Chemistry 2
4          Misc      1
5          Maths       1
2          Sport       1

Я бы хотел, чтобы химия вышла за пределы науки.

то есть десятка самых высоких показателей ... отсортировано по алфавиту


Результат

Спасибо вам обоим .. Даниэль и След.

Вот рабочий пример

( 
   SELECT     t.*, COUNT(*) AS tagcount
   FROM       tagged td
   LEFT JOIN  tags t ON (t.id = td.tag_id)
   GROUP BY   td.tag_id
   ORDER BY   tagcount DESC, t.title ASC
   LIMIT      3
) ORDER BY title ASC;

Ответы [ 2 ]

3 голосов
/ 07 сентября 2010

UPDATE:

В дополнение к новому комментарию ниже:

( 
   SELECT     t.*, COUNT(*) AS tagcount
   FROM       tagged td
   LEFT JOIN  tags t ON (t.id = td.tag_id)
   GROUP BY   td.tag_id
   ORDER BY   tagcount DESC, t.title ASC
   LIMIT      3
) ORDER BY title ASC;

Результат:

+------+------------+----------+
| id   | title      | tagcount |
+------+------------+----------+
|    3 | javascript |        2 |
|    1 | mysql      |        2 |
|    2 | php        |        3 |
+------+------------+----------+
3 rows in set (0.00 sec)

Просто измените LIMIT 3 на LIMIT 10, чтобы получить 10 лучших вместо 3 лучших.


Предыдущий ответ:

Почему бы вам не добавить LIMIT 10 к вашему запросу?

SELECT     t.*, COUNT(*) AS tagcount
FROM       tagged td
LEFT JOIN  tags t ON (t.id = td.tag_id)
GROUP BY   td.tag_id
ORDER BY   tagcount DESC, t.title ASC
LIMIT      10;

Контрольный пример:

CREATE TABLE tags (id int, title varchar(20));
CREATE TABLE tagged (tag_id int, post_id int);

INSERT INTO tags VALUES (1, 'mysql');
INSERT INTO tags VALUES (2, 'php');
INSERT INTO tags VALUES (3, 'javascript');
INSERT INTO tags VALUES (4, 'c');

INSERT INTO tagged VALUES (1, 1);
INSERT INTO tagged VALUES (2, 1);
INSERT INTO tagged VALUES (1, 2);
INSERT INTO tagged VALUES (2, 2);
INSERT INTO tagged VALUES (3, 3);
INSERT INTO tagged VALUES (2, 4);
INSERT INTO tagged VALUES (3, 4);
INSERT INTO tagged VALUES (4, 5);

Результат (с использованием LIMIT 3):

+------+------------+----------+
| id   | title      | tagcount |
+------+------------+----------+
|    2 | php        |        3 |
|    3 | javascript |        2 |
|    1 | mysql      |        2 |
+------+------------+----------+
3 rows in set (0.00 sec)

Обратите внимание на то, как тег [c] выпал из первых трех результатов, и в случае равенства строки упорядочены по алфавиту.

2 голосов
/ 07 сентября 2010

Работает ли запрос? Если да, вы можете использовать LIMIT 0, 10, чтобы получить только первые 10 строк.

SELECT tag.*, COUNT(td.tag_ID) AS tagcount
FROM Tagged td
LEFT JOIN gen_Tags tag ON td.tag_ID = tag.tag_ID
GROUP BY td.tag_ID
ORDER BY tagcount DESC, tag.tag_Title ASC LIMIT 0, 10

Еще одна вещь, которая может вас заинтересовать, это рейтинг. Смотрите здесь: http://www.fromdual.com/ranking-mysql-results

Редактировать

Может быть, подзапрос делает то, что вы хотите:

SELECT list.* FROM (
  SELECT tag.*, COUNT(td.tag_ID) AS tagcount, 
  FROM Tagged td
  LEFT JOIN gen_Tags tag ON td.tag_ID = tag.tag_ID
  GROUP BY td.tag_ID
  ORDER BY tagcount DESC LIMIT 0, 10
) AS list ORDER BY list.tag_Title ASC, list.tagcount DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...