mysql - 使用连接和子查询的具有多个搜索参数的 SQL Select

标签 mysql sql database

我花了几个小时为我的问题寻找答案,但结果并不令人满意。

我想通过一次查询从玩家、村庄和联盟中选择所有内容 - 表以及历史表中的日期和人口。

必须使用以下规则过滤选择:

  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 

HERE IS THE LINK TO SQLFIDDLE

HERE IS THE LINK TO PICTURE OF MY DATABASE EER DIAGRAM

最佳答案

经过一周的试用,我终于找到了答案。 通过此查询,我可以使用以下搜索参数:

  1. 按日期查找最新行
  2. 通过限制玩家拥有的村庄数量来查找行。
  3. 通过限制玩家拥有的村庄的总人口来查找行。
  4. 通过计算距离查找行。
  5. 从选择中排除球员或联盟。

这里是查询

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/

相关文章:

mysql - 何时在 MySql 或 MariaDB 中使用严格模式

php - MySQL获取上个月最后一天的所有内容

sql - 自动递增 ID 值

mysql - 设置默认标志 ​​- 多对多关系

SQL Server 将字符串列值连接到 5 个字符长

mysql - 从选择结果更新我的数据库

php - 使用 SQL 和 PHP 创建访问次数最多的列表?

mysql - 架构上所有数据表的数据列

sql - SYS_CONNECT_BY_PATH导致“ORA-01489:字符串连接的结果太长”

java - 尝试执行 CREATE TABLE sql 命令时,Netbeans 出现错误代码 -1,SQL 状态 42Z93