2012-10-02 38 views
10

Tôi đang cố tạo truy vấn trong bảng có 500.000 bản ghi và một số 50 hoặc 60 cột. Những gì tôi cần là để đối chiếu các bản ghi này thành các nhóm và chọn bản ghi tối đa trong mỗi nhóm.MySQL chọn bản ghi tối đa trong nhóm theo

Để đơn giản hóa vấn đề tôi có một bảng như sau

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 2 |  1004 |  2 | b  | 
| 3 |  1005 |  2 | c  | 
+----+-------------+----------+--------+ 

Các nhóm đơn giản bằng cách như sau

select * from temp GROUP BY group_id 

trả về

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 2 |  1004 |  2 | b  | 
+----+-------------+----------+--------+ 

Nice but không phải những gì tôi muốn . Những gì tôi muốn là toàn bộ hồ sơ cho max enternal_id trong mỗi nhóm. Nói cách khác

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 3 |  1005 |  2 | c  | 
+----+-------------+----------+--------+ 

Bằng cách nào đó tôi đang tìm cách đặt câu lệnh tối đa (external_id) vào đây để lọc những gì cần thiết nhưng cho đến nay tất cả điều tra của tôi đều thất bại. Một số hướng dẫn sẽ được đánh giá cao. Điều quan trọng là khi trả về giá trị max (external_id) mà toàn bộ bản ghi được chọn làm cột đường dẫn khác nhau.

+0

Có lẽ sử dụng "chọn MAX (EXTERNAL_ID) AS tối đa, * từ tạm GROUP BY GROUP_ID" bạn có thể làm điều này. – PiLHA

Trả lời

19

Phần lớn thông tin tại http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

này luôn luôn là một vấn đề gây phiền nhiễu trong MySQL. Đã có nhiều cách xung quanh nó, chẳng hạn như ghép một số trường lại với nhau (bắt đầu với external_id), và sau đó chọn MAX() của nó, và sau đó chia nhỏ nó ra xa nhau.

Tôi khuyên bạn nên sử dụng bảng có nguồn gốc. Bảng đầu tiên (t1) có nguồn gốc từ một truy vấn đơn giản, nơi bạn xác định các MAX(external_id), sau đó bạn tham gia từ đó để có được phần còn lại của dữ liệu.

NÀY LÀ CHỈ NẾU external_id LÀ UNIQUE

SELECT 
    t1.group_id, some_table.id, some_table.mypath 
FROM 
    (
     SELECT group_id, MAX(external_id) AS external_id 
     FROM some_table 
     GROUP BY group_id 
    ) as t1 
INNER JOIN 
    sometable ON t1.external_id = sometable.external_id 
WHERE ... 
+0

Có bạn hoàn toàn đúng. Thay đổi vấn đề là cách tốt nhất, tôi cần phải tuân theo quy tắc "nếu bạn có vấn đề bạn không thể giải quyết, hãy thay đổi nó thành một vấn đề bạn có thể". Với chỉ số phù hợp, nó hoạt động tốt. – user1715656

+0

Câu hỏi nhỏ, nhưng có lý do nào bạn chọn để chọn t1.group_id thay vì some_table.group_id không? Nó có hiệu quả hơn không? –

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