MySQL GROUP BY и SORT BY с участием - PullRequest
1 голос
/ 06 января 2011

Я получил 3 таблицы:

  1. элементов (item_id, метка времени)
  2. items_terms (item_id, term_id)
  3. терминов (term_id, term_name)

Мне нужно найти 5 самых последних терминов (term_id, term_name) на основе метки времени элемента. Я пытался решить это так:

SELECT t.term_id, t.term_name
 FROM items i
  INNER JOIN items_terms it USING(item_id)
  INNER JOIN terms t USING (term_id)
GROUP BY t.term_id 
ORDER BY i.timestamp DESC
LIMIT 5

Но проблема в том, что MySQL сначала сгруппирует элементы (это займет первый term_id) и игнорирует ORDER BY ..

Я также думал о фильтрации на стороне PHP путем удаления GROUP BY и выбора более 5 элементов, но этот запрос должен поддерживать разбиение на страницы без дубликатов на последовательных страницах.

Буду рад любым предложениям.

Ответы [ 3 ]

2 голосов
/ 06 января 2011

Как насчет включения отметки времени в оператор выбора:

SELECT t.term_id, t.term_name, MAX(i.timestamp)
 FROM items i
  INNER JOIN items_terms it USING(item_id)
  INNER JOIN terms t USING (term_id)
GROUP BY t.term_id, t.term_name
ORDER BY MAX(i.timestamp) DESC
LIMIT 5
0 голосов
/ 26 декабря 2011
 SELECT DISTINCT term_id, 
 DISTINCT term_name
 FROM(select t.term_id, t.term_name,i.timestamp FROM items i INNER JOIN items_terms it
 on i.item_id=it.item_id 
 INNER JOIN terms t
 on it.term_id=t.term_id
 GROUP BY t.term_id 
 )
 ORDER BY i.timestamp DESC
 LIMIT 5
0 голосов
/ 06 января 2011

Я бы посоветовал прочитать эту статью , поскольку в MySQL есть несколько методов ограничения строк из групп в GROUP BY select, и немногие из них могут удовлетворить ваши потребности. Обычно рекомендуется использовать директиву HAVING с переменными запроса «global», так как она работает с уже сгруппированным результирующим набором, что положительно влияет на производительность.

РЕДАКТИРОВАТЬ: Решение будет:

SELECT DISTINCT
  t.term_id,
  t.term_name
FROM
  items i
INNER JOIN items_terms it USING(item_id)
INNER JOIN terms t USING (term_id)
ORDER BY
  i.timestamp DESC
LIMIT 5
...