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

ただし、チーム名によって結果を最大 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)、ここに手を差し伸べているので、誰かが私のクエリを少し改良して、結果をチーム名ごとに3つに制限できるようにする方法を教えてくれることを願っています.. 1 の 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」列を追加します。トップ クエリは、Rownumber が 1 ~ 3 のすべてのレコードを選択します。

MYSQL には ROW_NUMBER() ネイティブ関数がないことを知っているので、代わりにこれを使用できます。

MySQL - 選択時に行番号を取得

于 2013-03-28T15:59:32.500 に答える