Форма заказа Mysql group by - PullRequest
       18

Форма заказа Mysql group by

1 голос
/ 03 апреля 2011

Хорошо, я получил эту таблицу

+-----+-----------------------------+-------------+-------------+----------+---------+
| id  | title                       | created     | updated     | category | content |
+-----+-----------------------------+---------------------+---------------------+----+
| 423 | What If I Get Sick and Die? | 2008-12-30  | 2009-03-11  | angst    | NULL    |
| 524 | Uncle Karl and the Gasoline | 2009-02-28  | NULL        | humor    | NULL    |
| 537 | Be Nice to Everybody        | 2009-03-02  | NULL        | advice   | NULL    |
| 573 | Hello Statue                | 2009-03-17  | NULL        | humor    | NULL    |
| 598 | The Size of Our Galaxy      | 2009-04-03  | NULL        | science  | NULL    |
+-----+-----------------------------+---------------------+---------------------+----+

Я пытаюсь получить уникальную строку для каждой категории, поэтому я запрашиваю что-то вроде:

SELECT id,title,category FROM `entries` group by category

И результат:

+-----+-----------------------------+----------+
| id  | title                       | category |
+-----+-----------------------------+----------+
| 537 | Be Nice to Everybody        | advice   |
| 423 | What If I Get Sick and Die? | angst    |
| 524 | Uncle Karl and the Gasoline | humor    |
| 598 | The Size of Our Galaxy      | science  |
+-----+-----------------------------+----------+

Результат выглядит хорошо, но как я могу получить строку с категорией = юмор и id = 573 вместо этого?

Если я запрашиваю что-то вроде:

SELECT id,title,category, max(id) FROM `entries` group by category

Я получил такой результат:

+-----+-----------------------------+----------+---------+
| id  | title                       | category | max(id) |
+-----+-----------------------------+----------+---------+
| 537 | Be Nice to Everybody        | advice   |     537 |
| 423 | What If I Get Sick and Die? | angst    |     423 |
| 524 | Uncle Karl and the Gasoline | humor    |     573 |
| 598 | The Size of Our Galaxy      | science  |     598 |
+-----+-----------------------------+----------+---------+

Очевидно, это не то, что я хочу, любая помощь будет оценена

И я хочу знать, как именно mysql свернуть строку для каждой группы? Mysql просто взял первый ряд для каждой группы?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2011
  • Использование JOIN

и запрос с GROUP BY, чтобы получить максимальный идентификатор для каждой категории (Полагаю, вам нужна строка с максимальным идентификатором для каждой категории?)

SELECT e.id
     , e.title
     , e.created
     , e.updated
     , e.category
     , e.content
FROM entries e
JOIN
    ( SELECT max(id) AS maxid
      FROM entries
      GROUP BY category
    ) AS cat
ON e.id = cat.maxid
  • Использование IN

и запрос для получения максимального идентификатора для каждой категории

SELECT id
     , title
     , created
     , updated
     , category
     , content
FROM entries
WHERE id IN
    ( SELECT max(id)
      FROM entries
      GROUP BY category
    )
  • Использование ЛЮБОГО

и коррелированный подзапрос

SELECT e.id
     , e.title
     , e.created
     , e.updated
     , e.category
     , e.content
FROM entries e
WHERE e.id >= ANY
    ( SELECT cat.id
      FROM entries cat
      WHERE e.category = cat.category
    )
  • Использование NOT EXISTS

и коррелированный подзапрос

SELECT e.id
     , e.title
     , e.created
     , e.updated
     , e.category
     , e.content
FROM entries e
WHERE NOT EXISTS
    ( SELECT 1
      FROM entries cat
      WHERE cat.id > e.id
        AND e.category = cat.category
    )
0 голосов
/ 03 апреля 2011

Я думаю, это то, что вы хотите.Я не проверял это все же.

select * from entries e
inner join (select max(id), category from entries group by category) ids
on e.id=ids.id
...