2013-03-28 94 views
0

我有這個查詢與最終施加的單個限制一起工作。mySQL具有多個限制的故障構建查詢

select distinct 
    loc.mID, 
    loc.city, 
    loc.state, 
    loc.zip, 
    loc.country, 
    loc.latitude, 
    loc.longitude, 
    baseInfo.firstname, 
    baseInfo.lastname, 
    baseInfo.profileimg, 
    baseInfo.facebookID, 
    (((acos(sin(('37.816876'*pi()/180)) * sin((`latitude`*pi()/180))+cos(('37.816876'*pi()/180)) * cos((`latitude`*pi()/180)) * cos((('-121.285410' - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance`, 
    teams.teamName, 
    teams.leagueType, 
    teams.teamType, 
    teams.subcat 
FROM memb_geo_locations loc 
left join memb_friends friends on (friends.mID = loc.mID or friends.friendID = loc.mID) and (friends.mID = '100018' or friends.friendID = '100018') 
join memb_baseInfo baseInfo on baseInfo.mID = loc.mID 
join memb_teams teams on teams.mID = loc.mID 
where 
    loc.primaryAddress = '1' 
    and ((friends.mID is null or friends.friendID is null) 
    or (friends.isactive = 2)) 
    and (
     teams.teamName like '%Anaheim Ducks%' 
     or teams.teamName like '%San Jose Sharks%' 
     or teams.teamName like '%New England Patriots%' 
     or teams.teamName like '%New York Yankees%' 
     or teams.teamName like '%Orlando Magic%' 
     ) 
    and loc.mID != 100018 
    having `distance` < 50 
    order by baseInfo.firstname 
    asc limit 30 

不過,我想我的結果由teamName限於3個結果每次最多,而且我已經試過的東西的

select distinct 
    loc.mID, 
    loc.city, 
    loc.state, 
    loc.zip, 
    loc.country, 
    loc.latitude, 
    loc.longitude, 
    baseInfo.firstname, 
    baseInfo.lastname, 
    baseInfo.profileimg, 
    baseInfo.facebookID, 
    (((acos(sin(('37.816876'*pi()/180)) * sin((`latitude`*pi()/180))+cos(('37.816876'*pi()/180)) * cos((`latitude`*pi()/180)) * cos((('-121.285410' - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance`, 
    teams.teamName, 
    teams.leagueType, 
    teams.teamType, 
    teams.subcat 
FROM memb_geo_locations loc 
left join memb_friends friends on (friends.mID = loc.mID or friends.friendID = loc.mID) and (friends.mID = '100018' or friends.friendID = '100018') 
join memb_baseInfo baseInfo on baseInfo.mID = loc.mID 
join memb_teams teams on teams.mID = loc.mID 
where 

    loc.primaryAddress = '1' 
    and ((friends.mID is null or friends.friendID is null) 
    or (friends.isactive = 2)) 

    and (
     (select * from memb_teams where teamName like '%Buffalo Bills%' limit 2), 
     (select * from memb_teams where teamName like '%San Jose Sharks%' limit 2), 
     (select * from memb_teams where teamName like '%New England Patriots%' limit 2) 
     ) 

    and loc.mID != 100018 

having `distance` < 150 
order by baseInfo.firstname 
asc limit 30 

程度沒有成功,通常只是語法錯誤..或Operand Should 1 Column(s)所以我在這裏伸出希望有人可以給我一些想法如何優化我的查詢一點,所以我可以限制結果爲每個teamName3 ..而不是交錯的結果,我可以有一個20和另一個4 2和另一個1和1(這是不希望的)。每個團隊需要3個或更少,只是不知道如何。想法,不涉及從查詢中處理大量數據集,並通過服務器端代碼循環來輸出我期望的結果?

+1

一點也沒有」在這樣的'WHERE'子句中放置一個'SELECT'是有意義的,我不明白你想要做什麼,把3個用逗號分開。 – Barmar 2013-03-28 04:55:35

+0

我不打算自己構建它,但這是我認爲你需要做的事情:編寫一個子查詢,生成每個選定行的每個團隊的等級(在mysql中搜索執行等級),然後在'在主查詢中rank <= 3'。 – Barmar 2013-03-28 04:58:40

+0

另請參閱http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/並搜索「mysql top n per集團「在SO。 – Barmar 2013-03-28 04:59:36

回答

0

在MSSQL中我使用ROW_NUMBER函數,它會是這樣的:

SELECT * FROM dbo.MyTable WHERE RECNO IN(SELECT RECNO FROM(SELECT Teamname,ROW_NUMBER()OVER(PARTITION BY Teamname ORDER BY RECNO DESC)AS intRow FROM dbo.MyTable)AS T WHERE intRow IN(1,2,3))

RECNO =你的獨特的記錄號

基本上你的子查詢選擇頂部3的記錄,添加新的「行號」列。 頂端查詢選擇所有ROWNUMBER 1之間的記錄,以3

我知道有在MYSQL沒有ROW_NUMBER()的本地函數,所以你可以用這個來代替:

MySQL - Get row number on select