1

問題の答えを探すのに何時間も費やしましたが、満足のいく結果は得られませんでした。

プレイヤー、村、同盟からの 1 つのクエリですべてを選択したいと考えています。テーブルと履歴テーブルからの日付と人口です。

選択は、次のルールでフィルタリングする必要があります。

  1. 日付ごとに最新情報を選択してください。
  2. プレイヤーが現時点で以下の数の村を持っている場合にのみ選択します。
  3. 現時点でプレイヤーの村の総人口が <= である場合にのみ選択します

    1. 3.頭が痛くなる原因です。それらをクエリに追加するにはどうすればよいですか?

これが私の現在のクエリです:

SELECT players.name AS player, 
       players.uid as uid, 
       players.tid, 
       villages.name AS village, 
       villages.vid as vid, 
       villages.fid as fid, 
       alliances.name AS alliance, 
       alliances.aid as aid, 
       SQRT( POW( least(abs($xcoord - villages.x),
                        400-abs($xcoord - villages.x)), 2 ) + 
             POW( least(abs($ycoord - villages.y),
                        400-abs($ycoord - villages.y)), 2 ) ) AS distance
FROM histories
LEFT JOIN players ON players.uid = histories.uid
LEFT JOIN villages ON villages.vid = histories.vid
LEFT JOIN alliances ON alliances.aid = histories.aid
LEFT JOIN histories h2 
       ON ( histories.vid = h2.vid AND histories.idhistory < h2.idhistory )
WHERE h2.vid IS NULL
  AND histories.uid != $uid
  AND SQRT( POW(least(abs($xcoord - villages.x),
                      400-abs($xcoord - villages.x)), 2 ) + 
            POW(least(abs($ycoord - villages.y),
                      400-abs($ycoord - villages.y)), 2 ) ) < $rad
ORDER BY distance

注意: xcoord と ycoord は検索フォームから投稿されます。

出力例:

PLayer| Village | Alliance | Distance

P1    | V1      | A1       | 1  
P2    | V4      | A2       | 2  
P1    | V2      | A1       | 3  
P1    | V3      | A1       | 4  
P2    | V5      | A2       | 5    

助けてくれてありがとう。:)

このクエリは、村が 2 つ未満のプレイヤーを見つけることができます。元のクエリとこれを組み合わせることができません。それは可能ですか?

SELECT
b.*, count(b.uid) as hasvillages
FROM 
histories b
WHERE 
b.vid IN (SELECT a.vid FROM villages a) 
GROUP BY 
b.uid
HAVING 
count(b.uid) < 2 

ここにSQLFIDDLEへのリンクがあります

ここに、私のデータベースの EER DIAGRAM の画像へのリンクがあります

4

1 に答える 1