Có thể NHÓM THEO nhiều cột bằng MySQL không?


205

Có thể có GROUP BYnhiều hơn một cột trong SELECTtruy vấn MySQL không? Ví dụ:

GROUP BY fV.tier_id AND 'f.form_template_id'

3
Bạn không thể nhóm theo hàng. Bạn có thể nhóm theo các cột mặc dù
Joe Phillips

Phiên bản cú pháp này là gì: stackoverflow.com/questions/2421388/
Kẻ

1
Bạn có thể cần thực hiện một truy vấn con thay vì sử dụng nhiều nhóm theo mệnh đề.
Adam F

Mặc dù hầu hết các câu trả lời được bình chọn cao về cơ bản là giống nhau (chúng hiển thị đúng cú pháp và giải thích hiệu quả của việc chuyển đổi thứ tự của hai cột), nếu nhu cầu của bạn hơi khác nhau, hãy xem xét câu trả lời của Daniklad .
ToolmakerSteve

Câu trả lời:



106

Có, bạn có thể nhóm theo nhiều cột. Ví dụ,

SELECT * FROM table
GROUP BY col1, col2

Các kết quả đầu tiên sẽ được nhóm theo col1, sau đó theo col2. Trong MySQL, ưu tiên cột đi từ trái sang phải.


5
Ưu tiên từ trái sang phải được áp dụng cho thứ tự tăng dần của các nhóm chứ không phải ưu tiên nhóm cột. GROUP BYáp dụng col1+col2. ví dụ col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2và chạy GROUP BY col1,col2sẽ trở lại 1,1|1,3|2,2trái ngược với 1,1|2,2đề xuất. Trong khi đó GROUP BY col2, col1sẽ thay đổi thứ tự tăng dần của col2 trở lại. 1,1|2,2|1,3 Bản trình diễn: sqlfiddle.com/#!9/d5f69/1 Lưu ý rằng id hàng: 2 được trả về trong cả hai trường hợp 2,2mặc dù đảo ngược các cột.
fyrye

Thêm một thử nghiệm nữa. sqlfiddle.com/#!9/5c8763/2 Kết luận. Đầu tiên mysql sắp xếp theo cột được xác định đầu tiên (với GROUP BY). Và nếu trong cột được xác định đầu tiên có kết quả bằng nhau, thì chỉ trong các kết quả bằng nhau được sắp xếp theo cột được xác định thứ hai
user2360831

Về việc SUMsử dụng với GROUP BY. Nếu GROUP BYchỉ bằng một cột, thì SUMtất cả các giá trị của mỗi giá trị riêng biệt (khác nhau) giá trị cột sqlfiddle.com/#!9/1cbde2/2 . Nếu GROUP BYhai cột. Sau đó, mysql đầu tiên kiểm tra xem giá trị cột đầu tiên có các giá trị khác nhau trong cột thứ hai không. Nếu có, thì mysql SUMmỗi giá trị khác nhau của cột thứ hai sqlfiddle.com/#!9/1cbde2/1 .
dùng2360831

23

Có, nhưng việc nhóm theo hai cột có ý nghĩa gì? Chà, giống như việc nhóm theo từng cặp duy nhất trên mỗi hàng. Thứ tự bạn liệt kê các cột thay đổi cách sắp xếp các hàng.

Trong ví dụ của bạn, bạn sẽ viết

GROUP BY fV.tier_id, f.form_template_id

Trong khi đó, mã

GROUP BY f.form_template_id, fV.tier_id

sẽ cho kết quả tương tự, nhưng được sắp xếp khác nhau.



13

Để sử dụng một ví dụ đơn giản, tôi đã có một bộ đếm cần tóm tắt các địa chỉ IP duy nhất trên mỗi trang được truy cập trên một trang web. Về cơ bản là nhóm theo pagename và sau đó bằng IP. Tôi đã giải quyết nó bằng sự kết hợp của DISTINCT và GROUP BY.

SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;

2
Câu trả lời này đáng chú ý, vì nó giải quyết một vấn đề hơi khác so với các câu trả lời khác.
ToolmakerSteve

5

Nếu bạn thích (tôi cần áp dụng nhóm này) theo hai cột cùng một lúc, tôi chỉ thấy điểm này:

SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1

1
Xem ý kiến ​​của ypercube dưới câu trả lời của lada. Xem xét như là một thay thế : SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. Các kết quả thường sẽ trông giống như câu trả lời này, nhưng thực thi nội bộ thì hoàn toàn khác.
ToolmakerSteve

-2
GROUP BY CONCAT(col1, '_', col2)

37
Tôi tự hỏi làm thế nào một câu trả lời chỉ với một dòng mã, được đăng 4 năm sau khi câu hỏi đã được trả lời nhận được 8 (tám!) Upvotes. Trong khi cũng không chính xác và không hiệu quả bên cạnh muộn và ngắn.
ypercubeᵀᴹ

8
@ ypercubeᵀᴹ tại sao bạn nói nó không đúng? Đây chính xác là những gì tôi đang tìm kiếm và một cách giải thích chính xác về "nhóm theo nhiều cột". Trên thực tế, tôi không biết tại sao đây không phải là hành vi của "nhóm theo col1, col2" như tôi mong đợi
Abram

3
@ Abram ping bạn, vì vậy bạn thấy câu trả lời của tôi cho NeverEinatingQueue. Nhược điểm: nó ít hơn - kém hiệu quả hơn nhiều GROUP BY col1, col2. Nó sẽ cho kết quả sai với một số dữ liệu. Nói col1, col2có giá trị: ('a_b', 'c')trong một hàng và ('a', 'b_c')trong một hàng khác. Câu trả lời sai này, với GROUP BY CONCAT sẽ tổng hợp hai hàng thành một. Câu trả lời đúng sẽ không.
ypercubeᵀᴹ

1
Không ai ngăn bạn sử dụng biểu thức CONCAT trong danh sách CHỌN bằng cách này, nếu bạn cần nó:SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
ypercubeᵀᴹ

1
@ ypercubeᵀᴹ oops, thật ngu ngốc khi tôi nghĩ "nhóm theo foo, bar" hành xử như "... nhóm của foo union ... nhóm theo thanh". Nó thực sự là một trường hợp bất thường đối với NHÓM THEO CONCAT.
Abram
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.