2012-09-29 63 views
1

我有以下表格,我運行正確的SQL查詢嗎?

上市:

ID varchar2(33) 
Name varchar2(100) 

用戶:

ID varchar2(33) 
Name varchar2(100) 

User_Listing

ID auto-generated 
UserId references ID from Users 
ListingId references ID from Listing 

我想找到用戶的喜愛上市(本在User_listing表中列出具有最高計數的列表或例如 如果user_listing表包含<id,user_id,listing_id>,

1 1 2 
1 1 3 
1 2 3 
1 3 3 

的最愛列表3

是它運行正確的查詢?

Select Listing.name 
    from Listing 
where Listing.id = (Select p.id 
         from User_listing p, User_listing q 
        having count(p.id) > count(q.id) 
         GROUP BY p.id) 

此外,如果我不得不打印出前5名的最愛,我該怎麼做?

+0

對於第二個問題,使用** ** LIMIT選擇前五個記錄 – user1406062

+2

添加標籤與正在使用將有助於獲得相應的RDBMS你更好的答案。正如你所看到的,答覆者正試圖給你所有RDBMS的答案,除非你直接要求,否則這是沒有必要的。 – Yaroslav

+0

子選擇中沒有JOIN。這看起來很可疑。 –

回答

0

這取決於你使用什麼SQL的風格,至少對於你獲得前5條記錄的部分。在SQL Server中,您將使用「Select Top 5」。在MySQL,Postgres,Oracle等中,它是「限制5」。

下面是選擇對前5名列表的所有信息的MySQL的解決方案:

SELECT * FROM listing 
JOIN 
(SELECT listing_id 
FROM user_listing 
GROUP BY listing_id 
ORDER BY count(listing_id) DESC 
LIMIT 5) as top_five ON top_five.listing_id=listing.id; 

如果你只需要在上面列表的ID,你可以像這樣做,而不是:

SELECT listing_id 
    FROM user_listing 
    GROUP BY listing_id 
    ORDER BY count(listing_id) DESC 
    LIMIT 5 
0

甲骨文方式

select * from (
    select ListingID, Name, count(*) FrequencyOfListingID 
     from UserListing, Listing 
    where Listing.ID = UserListing.ListingID 
    group by ListingID 
    order by 2 desc) 
where rownum < 6 

MSSQL方式沒有測試

select Top 5 ListingID, Name, count(*) FrequencyOfListingID 
     from UserListing, Listing 
    where Listing.ID = UserListing.ListingID 
    group by ListingID 
    order by 2 desc) 

MYSQL方式沒有測試

select ListingID, Name, count(*) FrequencyOfListingID 
     from UserListing, Listing 
    where Listing.ID = UserListing.ListingID 
    group by ListingID 
    order by 2 desc 
    Limit 5