2011-01-18 24 views
5

Tôi muốn có thể trả lại 5 đơn vị cho mỗi menu. Tôi đã thử một số kịch bản nhưng không có may mắn. đây là các bảngmySQL Quay trở lại 5 đầu trang của mỗi thể loại

menus 
------- 
menuid int() 
profileName varchar(35) 

menuitems 
----------- 
itemid int() 
name varchar(40) 

Đây là những gì tôi có ngay bây giờ. Tôi nhận được thông báo lỗi với tập lệnh bên dưới. Lỗi: Truy vấn con trả về sau đó thêm 1 hàng.

SELECT m.profilename, name 
FROM menus m 
WHERE (SELECT name 
     from menuitems s 
     where m.menuid = s.menuid 
     limit 5) 

Mọi đề xuất đều được đánh giá cao.

Trả lời

13

Bạn phải sử dụng các biến ảnh hưởng phụ cho điều này

SELECT profilename, name 
FROM 
(
    SELECT m.profilename, s.name, 
     @r:=case when @g=m.profilename then @r+1 else 1 end r, 
     @g:=m.profilename 
    FROM (select @g:=null,@r:=0) n 
    cross join menus m 
    left join menuitems s on m.menuid = s.menuid 
) X 
WHERE r <= 5 
+1

Cảm ơn bạn rất nhiều! Tôi đã bị mắc kẹt về điều này trong nhiều ngày. – user281867

+0

WOW ... lựa chọn các biến nội tuyến trong một truy vấn ... Tôi chưa bao giờ thấy điều đó trước đây ... Lạ lùng, nhưng thật tuyệt. – DRapp

+0

Điều đó thật tuyệt vời. – Devgeeks

-3
SELECT TOP 5 m.profilename, s.name 
FROM menus m INNER JOIN menuitems s ON m.menuID = s.menuid 
+0

Bạn đang giả định rằng ông có 'menuid' trong 'bảng menuitems'? – VoodooChild

+3

mysql không hỗ trợ "TOP N". – nos

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