2011-12-18 37 views
23

Tôi dường như không tìm được giải pháp phù hợp cho vấn đề sau (có thể là tuổi) nên hy vọng ai đó có thể làm sáng tỏ. Tôi cần trả về 1 cột riêng biệt cùng với các cột không phân biệt khác trong mySQL.Chọn cột riêng biệt cùng với một số cột khác trong MySQL

Tôi có bảng sau trong mySQL:

id  name  destination  rating  country 
---------------------------------------------------- 
1  James  Barbados  5   WI 
2  Andrew  Antigua   6   WI 
3  James  Barbados  3   WI 
4  Declan  Trinidad  2   WI 
5  Steve  Barbados  4   WI 
6  Declan  Trinidad  3   WI 

Tôi muốn câu lệnh SQL để trả lại tên DISTINCT cùng với các điểm đến, đánh giá dựa trên quốc gia.

id  name  destination  rating  country 
---------------------------------------------------- 
1  James  Barbados  5   WI 
2  Andrew  Antigua   6   WI 
4  Declan  Trinidad  2   WI 
5  Steve  Barbados  4   WI 

Như bạn có thể thấy, James và Declan có xếp hạng khác nhau, nhưng cùng tên, do đó, chỉ được trả lại một lần.

Truy vấn sau trả về tất cả các hàng vì xếp hạng khác nhau. Có anyway tôi có thể trả lại tập kết quả ở trên?

SELECT (distinct name), destination, rating 
    FROM table 
WHERE country = 'WI' 
ORDER BY id 

Trả lời

20

Sử dụng một subquery, bạn có thể lấy id cao nhất cho mỗi tên, sau đó chọn phần còn lại của hàng dựa trên rằng:

SELECT * FROM table 
WHERE id IN (
    SELECT MAX(id) FROM table GROUP BY name 
) 

Nếu bạn muốn, sử dụng MIN(id) để có được bản ghi đầu tiên cho mỗi tên thay vì tên cuối cùng.

Nó cũng có thể được thực hiện với một số INNER JOIN đối với truy vấn phụ. Vì mục đích này, hiệu suất nên giống nhau và đôi khi bạn cần tham gia trên hai cột từ truy vấn phụ.

SELECT 
    table.* 
FROM 
    table 
    INNER JOIN (
    SELECT MAX(id) AS id FROM table GROUP BY name 
) maxid ON table.id = maxid.id 
4

Vấn đề là các tác phẩm khác biệt trên toàn bộ tập hợp trả lại chứ không chỉ là trường đầu tiên. Nếu không thì MySQL sẽ không biết bản ghi nào sẽ trả về. Vì vậy, bạn muốn có một số chức năng nhóm về xếp hạng, cho dù MAX, MIN, GROUP_CONCAT, AVG, hoặc một số chức năng khác.

Michael đã đăng câu trả lời hay, vì vậy tôi sẽ không viết lại truy vấn.

3

Bạn có thể làm một group by:

select min(id) as id, name, destination, avg(rating) as rating, country from TABLE_NAME group by name, destination, country 
2

Tôi đồng ý với @rcdmk. Sử dụng truy vấn phụ DEPENDENT có thể giết hiệu suất, GROUP BY có vẻ phù hợp hơn với điều kiện bạn đã INDEXed trường quốc gia và chỉ một vài hàng sẽ đến máy chủ. Viết lại truy vấn giben bằng @rcdmk, tôi đã thêm mệnh đề ORDER BY NULL để chặn thứ tự ngầm của GROUP BY, để làm cho nó nhanh hơn một chút:

SELECT MIN(id) as id, name, destination as rating, country 
FROM table WHERE country = 'WI' 
GROUP BY name, destination ORDER BY NULL 
Các vấn đề liên quan