問題の答えを探すのに何時間も費やしましたが、満足のいく結果は得られませんでした。
プレイヤー、村、同盟からの 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