我花了几个小时为我的问题寻找答案,但结果并不令人满意。
我想通过一次查询从玩家、村庄和联盟中选择所有内容 - 表以及历史表中的日期和人口。
必须使用以下规则过滤选择:
- 按日期选择最新信息。
- 仅当玩家当前有 <= 个村庄时才选择。
仅当玩家村庄的总人口为<=此时
时才选择- 和 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
最佳答案
经过一周的试用,我终于找到了答案。 通过此查询,我可以使用以下搜索参数:
- 按日期查找最新行
- 通过限制玩家拥有的村庄数量来查找行。
- 通过限制玩家拥有的村庄的总人口来查找行。
- 通过计算距离查找行。
- 从选择中排除球员或联盟。
这里是查询
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
关于mysql - 使用连接和子查询的具有多个搜索参数的 SQL Select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17821479/