2013-03-13 27 views
14

Tôi có bảng gọi là câu hỏi sau:Làm thế nào để nhóm bởi DESC đặt

ID | asker 
1 | Bob 
2 | Bob 
3 | Marley 

Tôi muốn chọn từng hỏi một lần duy nhất và nếu có nhiều người hỏi có cùng tên, chọn một trong những id cao nhất . Vì vậy, kết quả mong đợi:

ID | asker 
3 | Marley 
2 | Bob 

tôi sử dụng truy vấn sau đây:

SELECT * FROM questions GROUP by questions.asker ORDER by questions.id DESC 

tôi nhận được kết quả sau:

ID | asker 
3 | Marley 
1 | Bob 

Vì vậy, nó lựa chọn đầu tiên 'Bob' nó gặp thay của người cuối cùng.

Cảm ơn

+0

Câu hỏi: Cột ID của bạn có được đặt là INTERGERS hoặc VARCHAR không? –

+0

tự động tăng số nguyên –

Trả lời

25

Nếu bạn muốn cuối cùng id cho mỗi asker, sau đó bạn nên sử dụng một chức năng tổng hợp:

SELECT max(id) as id, 
    asker 
FROM questions 
GROUP by asker 
ORDER by id DESC 

Lý do tại sao bạn nhận được kết quả bất thường là vì MySQL sử dụng phần mở rộng cho GROUP BY cho phép các mục trong danh sách chọn không được phân cụm và không được bao gồm trong mệnh đề GROUP BY. Tuy nhiên điều này có thể dẫn đến kết quả không mong muốn vì MySQL có thể chọn các giá trị được trả về. (Xem MySQL Extensions to GROUP BY)

Từ MySQL Documents:

MySQL mở rộng việc sử dụng GROUP BY để danh sách lựa chọn có thể tham khảo cột nonaggregated không có tên trong mệnh đề GROUP BY. ... Bạn có thể sử dụng tính năng này để có hiệu suất tốt hơn bằng cách tránh phân loại và nhóm cột không cần thiết. Tuy nhiên, điều này hữu ích chủ yếu khi tất cả các giá trị trong mỗi cột không được phân tách không được đặt tên trong GROUP BY giống nhau cho mỗi nhóm. Máy chủ được tự do chọn bất kỳ giá trị nào từ mỗi nhóm, do đó, trừ khi chúng giống nhau, các giá trị được chọn là không xác định. Hơn nữa, việc lựa chọn các giá trị từ mỗi nhóm không thể bị ảnh hưởng bằng cách thêm mệnh đề ORDER BY. Việc sắp xếp tập hợp kết quả xảy ra sau khi các giá trị đã được chọn, và ORDER BY không ảnh hưởng đến các giá trị mà máy chủ chọn.

+0

Không làm việc với tôi – itsazzad

+0

@itsazzad Ý của bạn là "không làm việc cho tôi"? Đó không phải là giải thích mô tả nhất về một vấn đề. – Taryn

+2

nếu tôi sử dụng 'SELECT *, max (id) là id' thì nó không cho kết quả chính xác – itsazzad

2

Các hồ sơ cần phải được nhóm sử dụng GROUP BYMAX() để có được ID tối đa cho mỗi asker.

SELECT asker, MAX(ID) ID 
FROM TableName 
GROUP BY asker 

OUTPUT

╔════════╦════╗ 
║ ASKER ║ ID ║ 
╠════════╬════╣ 
║ Bob ║ 2 ║ 
║ Marley ║ 3 ║ 
╚════════╩════╝ 
+0

Làm thế nào để bạn nhận được id tối đa cho mọi id? – fungusanthrax

1

Những người khác là chính xác về việc sử dụng MAX (ID) để nhận được kết quả bạn muốn. Nếu bạn thắc mắc tại sao truy vấn của bạn không hoạt động, đó là vì ORDER BY xảy ra sauGROUP BY.

15

Thông thường MySQL chỉ cho phép nhóm theo thứ tự tăng dần. Vì vậy, chúng tôi có thể đặt hàng các bản ghi trước khi nhóm.

 
SELECT * 
FROM (
    SELECT * 
    FROM questions 
    ORDER BY id DESC 
) AS questions 
GROUP BY questions.asker 
0

Để có được mỗi cột:

SELECT * FROM questions 
WHERE id IN 
(SELECT max(id) as id, asker 
FROM questions 
GROUP by asker 
ORDER by id DESC) 

Phiên bản cải tiến của câu trả lời của @bluefeet.

Các vấn đề liên quan