2010-02-06 32 views
5

Tôi có một cơ sở dữ liệu MYSQL5 và PHP 5. Tôi cần một truy vấn cho một trang chỉ mục trang web trò chơi mà chỉ chọn 12 từ đầu tiên từ mỗi thể loại trò chơi. Đây là những gì tôi có cho đến nay.Truy vấn SQL nâng cao. Top 12 từ mỗi loại (MYSQL)

$db->query("SELECT * FROM `games` WHERE status = 'game_published' AND `featured` = '1' ORDER BY `category`"); 

Mã php sau đó nhóm các trò chơi cùng thể loại lại với nhau và hiển thị chúng. Nhưng yeah nó không giới hạn số lượng trò chơi từ mỗi thể loại như tôi muốn.

Đây là chính xác những gì cấu trúc của bảng trông giống như: i49.tinypic.com/aysoll.png

Đây là một bài viết trên blog mà âm thanh như những gì tôi đang cố gắng để làm: http://www.e-nformation.net/content/view/title/MySQL+Top+N+in+each+group+(group+inner+limit) Nhưng tôi không thể hãy hiểu nó.

Mọi trợ giúp đều được đánh giá cao.

Trả lời

1

Làm thế nào về điều này?

SELECT * FROM (
    SELECT 
     games.*, 
     @rn := CASE WHEN @category=category THEN @rn + 1 ELSE 1 END AS rn, 
     @category := category 
    FROM games, (SELECT @rn := 0, @category := NULL) AS vars 
    WHERE status = 'game_published' AND featured = '1' 
    ORDER BY category 
) AS T1 
WHERE rn <= 12 
+0

Một số giải pháp khác hoạt động nhưng tôi nghĩ đây là giải pháp tốt nhất. Cảm ơn. – Neddy

0

Để sử dụng kỹ thuật từ các bài đăng bạn đề cập, bạn cần một cách để đặt hàng trò chơi. Họ đang sử dụng ngày bài viết. Sau đó, họ chọn số lượng bài viết cũ hơn cho công ty đó và nói rằng không thể có nhiều hơn ba.

Nếu bảng trò chơi của bạn có một cột auto-increment gọi id, bạn có thể chọn 10 trò chơi hàng đầu cho mỗi thể loại như:

SELECT * 
FROM  games g1 
WHERE status = 'game_published' 
     AND featured = '1' 
     AND 10 > 
     (
     SELECT COUNT(*) 
     FROM  games g2 
     WHERE g2.status = 'game_published' 
        AND g2.featured = '1' 
        AND g1.category = g2.category 
        AND g2.id > g1.id 
     ) 

Điều kiện where nói rằng không thể có nhiều hơn 10 dòng với cùng danh mục và ID cao hơn.

+0

Ah, không làm theo các liên kết bài viết. Đó sẽ là thanh lịch hơn - nhưng có lẽ nhiều hơn nữa là cong vênh - cách để làm điều đó. –

0

Có thể có giải pháp thanh lịch hơn, nhưng bạn chỉ có thể thực hiện truy vấn cho từng danh mục. Đầu tiên có được một danh sách các loại:

SELECT DISTINCT(category) FROM `games`; 

Sau đó lấy mỗi kết quả và truy vấn cho 12 hàng:

SELECT * FROM games WHERE status = 'game_published' 
AND `featured` = '1' AND `category` = $category LIMIT 12; 

Tất nhiên bạn cần phải thêm một số loại xếp hạng hàng (và trật tự của nó) để có được những đầu 12.

Note: có thể có một cách để làm điều này với một truy vấn duy nhất, nhưng nó thoát cho tôi vào lúc này.

1

bạn có thể sử dụng UNION, nếu chúng ta không nói về triệu các loại ...

pseudoSQL:

(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10) 
UNION 
(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10) 
UNION 
(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10) 

Nếu bạn có hàng loạt các loại trong chương trình PHP/ASP, bạn có thể tạo ra liên minh này khi đang bay.

thêm: http://dev.mysql.com/doc/refman/5.0/en/union.html

EDIT: Đây có thể là tài nguyên hữu ích nhất: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Sử dụng nó cũng ^^

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