0

我有这个查询,它适用于最后施加的单一限制。

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)我在这里联系,希望有人能给我一些想法如何改进我的查询,这样我就可以将结果限制为每个 teamName 3.. 而不是在我交错的结果可以有 20 个一个和 4 个另一个 2 个另一个和 1 个和 1 个(这是不希望的)。每个团队需要3个或更少,只是不知道如何。不涉及从查询中处理大量数据集并通过服务器端代码循环以输出我想要的结果的想法?

4

1 回答 1

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 条记录,添加一个新的“ROW NUMBER”列。Top Query 选择行号在 1 到 3 之间的所有记录。

我知道 MYSQL 中没有 ROW_NUMBER() 本机函数,因此您可以改用它:

MySQL - 在选择时获取行号

于 2013-03-28T15:59:32.500 回答