2010-03-02 30 views
11

Theo như tôi biết nhóm mysql THEO nhóm đến hồ sơ cuối cùng được tìm thấy.GROUP BY trả lại hồ sơ đầu tiên

Có giải pháp nào cho GROUP THEO bản ghi đầu tiên không?

Tôi đã thiết lập lệnh ORDER trong SQL và tôi cần GROUP BY trả về bản ghi đầu tiên và không phải là bản ghi cuối cùng.

EDIT

Đây là Query

SELECT 
    DISTINCT(master.masterID), 
    langData.*, 
    master.* 
FROM master_table as master 
INNER JOIN lang_table as langData ON 
langData.masterID=master.masterID 
GROUP BY master.masterID 
ORDER BY 
CASE 
    WHEN langData.lang='currentLang' THEN 1 ELSE 999 END , 
    master.name desc LIMIT 0,10 

Các truy vấn trên chọn masterID cho bảng đa ngôn ngữ và giả sử để trở FIRST các bản ghi trong currentLang và sắp xếp chúng theo tên VÀ THEN bài khác ngôn ngữ.

Đừng hỏi tôi tại sao tôi không đặt ngôn ngữ thành JOIN. Đây là cách để làm.

Vì vậy, mọi thứ hoạt động tốt cho đến nay mong đợi trường hợp tôi có bản ghi với các ngôn ngữ enfr. Nếu currentLangen sau đó dựa trên

langData.lang='currentLang' THEN 1 ELSE 999 END 

thứ tự en là 1 và fr trật tự là 999 và thay vì nhận được giá trị của en tôi nhận được giá trị của fr.

Đó là lý do tôi muốn nhóm thành hàng đầu tiên.

+0

Tôi sẽ không hỏi bạn tại sao bạn không cài đặt ngôn ngữ trong 'JOIN' thay vào đó, tôi sẽ nói với bạn rằng cách này nó sẽ không hoạt động. Một biểu thức tách rời trong 'GROUP BY' trả về một bản ghi tùy ý từ mỗi nhóm và không được sử dụng nếu các giá trị khác nhau. Bạn có thể trả về bất kỳ bản ghi nào từ 'master_table' (tất cả chúng sẽ giống nhau trong mỗi nhóm) nhưng không phải là từ' lang_table'. Không có đảm bảo về hồ sơ nào sẽ được trả lại, nada, niente. 'BTW', tại sao bạn có' DISTINCT' ở đây, mục đích của nó là gì? – Quassnoi

+0

Tôi đang cố gắng đạt được "cung cấp cho tôi tất cả hồ sơ từ thứ tự ngôn ngữ hiện tại theo tên và sau đó cho tất cả các ngôn ngữ khác theo thứ tự" Có nghĩa là: nếu hiện tại lang EN sau đó nhận được tất cả hồ sơ cho EN và sau đó lấy tất cả hồ sơ cho các ngôn ngữ khác. IF trong bảng lang cho một bản ghi có EN, FR trả về giá trị EN.IF trong bảng lang EN không tồn tại trả về bất kỳ lang nào khác – ntan

+0

điều này rất dễ thực hiện với 'JOIN' như được mô tả ở đây: http: // explainextended. com/2009/08/10/fallback-language-name-mysql/nhưng vì một số lý do lạ (mà bạn thậm chí không muốn được yêu cầu) bạn không muốn sử dụng nó. – Quassnoi

Trả lời

11

Tôi giả sử bạn đang nói về cái gì đó như

SELECT * 
FROM mytable 
GROUP BY 
     column 

Bạn không nên sử dụng biểu thức tính chung trong GROUP BY trừ khi họ là tất cả cùng trong nhóm.

Nếu bạn muốn quay trở lại kỷ lục giữ giá trị nhỏ nhất của một biểu thức trong một nhóm, sử dụng này:

SELECT mo.* 
FROM (
     SELECT DISTINCT column 
     FROM mytable 
     ) md 
JOIN mytable mo 
ON  mo.id = 
     (
     SELECT id 
     FROM mytable mi 
     WHERE mi.column = md.column 
     ORDER BY 
       mi.column, mi.someorder 
     LIMIT 1 
     ) 
1

Thêm LIMIT 1 vào truy vấn của bạn.

+0

không thể. Ghi lại sơ đồ lưới và phân trang – ntan