2013-03-28 135 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