SQL使用连接和子查询选择多个搜索参数

时间:2013-07-23 21:33:56

标签: mysql sql database

我花了几个小时搜索我的问题的答案而没有令人满意的结果。

我想从玩家,村庄和联盟的一个查询中选择所有内容 - 历史表中的表格,日期和人口。

必须按照以下规则过滤选择:

  1. 按日期选择最新信息。
  2. 仅在玩家目前拥有< =村庄数量时选择。
  3. 仅在玩家所有村庄的总人口<目前时选择

    1. 和3.是导致我头部受伤的人。如何将这些添加到我的查询?
  4. 这是我当前的查询:

    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 个答案:

答案 0 :(得分:1)

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

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

    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
    
相关问题