2013-01-17 42 views
8

Đây là bảng sản phẩm và có vài triệu bản ghi.

enter image description hereTruy vấn SELECT trả lại 1 hàng từ mỗi nhóm

Tôi muốn liệt kê kỷ lục như sau:
Thông thường tôi sử dụng:

SELECT id, 
     product_name, 
     store_id 
FROM product 
GROUP BY store_id 
ORDER BY id. 


Hiện nay có vấn đề hiệu suất SQL. Tôi cần truy vấn SQL để kết quả đầu ra như thế này.

enter image description here

+0

Vui lòng đăng cấu trúc bảng và đầu ra của câu lệnh giải thích như là một phần của câu hỏi để chúng tôi có thể thấy TẠI SAO truy vấn quá chậm. Đảm bảo bao gồm các chỉ mục trong định nghĩa bảng. – Namphibian

+0

đề cập đến tên bảng của bạn trong truy vấn "từ sản phẩm" –

Trả lời

18

Có rất nhiều lựa chọn thay thế để giải quyết này, một trong đó tôi khuyên bạn nên là đã tham gia một subquery đó riêng được mới nhất ID (giả định rằng các cột là AUTO_INCREMENT ed) cho mỗi store_ID.

SELECT a.* 
FROM tableName a 
     INNER JOIN 
     (
      SELECT store_ID, MAX(ID) max_ID 
      FROM tableName 
      GROUP BY store_ID 
     ) b ON a.store_ID = b.store_ID AND 
       a.ID = b.max_ID 

cho hiệu suất tốt hơn, hãy chắc chắn để có một chỉ mục trên các cột: IDstore_id.

UPDATE 1

nếu bạn muốn có giới hạn cho mỗi hồ sơ, sử dụng dưới đây,

SELECT ID, product_Name, store_ID 
FROM tableName a 
WHERE 
    (
    SELECT COUNT(*) 
    FROM tableName b 
    WHERE b.store_ID = a.store_ID AND b.ID >= a.ID 
) <= 2; 
+0

Tốt. Đó là công việc! Tôi có thể giới hạn 2 bản ghi từ mỗi store_id không? –

+0

Tuyệt vời. Nhưng tôi có thể sắp xếp ID DESC không? –

+0

chắc chắn, hãy xem liên kết này, http://www.sqlfiddle.com/#!2/ba920/12 –

1

Hãy thử này xin vui lòng:

SELECT * FROM YOURTABLE B 
JOIN (SELECT MAX(ID) MX FROM YOURTABLE GROUP BY STORE_ID) A 
ON A.STORE_ID = B.STORE_ID 
AND B.ID = A.MX 
GROUP BY B.STORE_ID 
; 
2
SELECT store_id,id,product_name FROM table_name 
WHERE id IN (SELECT MAX(id) FROM table_name GROUP BY store_id) 
ORDER BY id 

điều này sẽ hoạt động và bạn có thể đặt hàng theo yêu cầu của bạn theo store_id hoặc id.

+0

@ J-W: Điều này khác với câu trả lời được chấp nhận (ngoài cú pháp) như thế nào? Dường như kết quả là chính xác trong cả hai trường hợp. – Priednis

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