我花了几个小时搜索我的问题的答案而没有令人满意的结果。
我想从玩家,村庄和联盟的一个查询中选择所有内容 - 历史表中的表格,日期和人口。
必须按照以下规则过滤选择:
仅在玩家所有村庄的总人口<目前时选择
这是我当前的查询:
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
答案 0 :(得分:1)
经过一周的试用,我终于找到了答案。 使用此查询,我可以使用以下搜索参数:
这是查询
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(100 - villages.x),400-abs(100 - villages.x)), 2 ) +
POW( least(abs(100 - villages.y),400-abs(100 - 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
WHERE histories.uid IN
(SELECT b.uid FROM histories b
WHERE (b.vid IN (SELECT a.vid FROM villages a) and b.date
in (select max(date) from histories))
GROUP BY b.uid HAVING count(b.uid) < 4 AND
sum(b.population) < 2000)
AND histories.uid != 1
and histories.date in (select max(date) from histories)
AND SQRT( POW( least(abs(100 - villages.x),400-abs(100 - villages.x)),2)+
POW( least(abs(100 - villages.y),400-abs(100 - villages.y)), 2 ) ) < 200
ORDER BY distance