Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用联接和子查询使用多个搜索参数进行SQL选择_Mysql_Sql_Database - Fatal编程技术网

Mysql 使用联接和子查询使用多个搜索参数进行SQL选择

Mysql 使用联接和子查询使用多个搜索参数进行SQL选择,mysql,sql,database,Mysql,Sql,Database,我花了好几个小时为我的问题寻找答案,但没有令人满意的结果 我想通过一个查询从玩家、村庄和联盟中选择所有内容-历史表中的表和日期和人口 必须使用以下规则筛选所选内容: 按日期选择最新信息。 仅当玩家经过一周的尝试后,我终于找到了答案时才选择。 通过此查询,我可以使用以下搜索参数: 按日期查找最新的行 通过限制玩家拥有的村庄数量来查找行。 通过限制玩家所在村庄的总人口来查找行。 通过计算距离来查找行。 从选择中排除玩家或联盟。 这是一个问题 SELECT players.name AS player

我花了好几个小时为我的问题寻找答案,但没有令人满意的结果

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

必须使用以下规则筛选所选内容:

按日期选择最新信息。
仅当玩家经过一周的尝试后,我终于找到了答案时才选择。 通过此查询,我可以使用以下搜索参数:

按日期查找最新的行 通过限制玩家拥有的村庄数量来查找行。 通过限制玩家所在村庄的总人口来查找行。 通过计算距离来查找行。 从选择中排除玩家或联盟。 这是一个问题

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

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

按日期查找最新的行 通过限制玩家拥有的村庄数量来查找行。 通过限制玩家所在村庄的总人口来查找行。 通过计算距离来查找行。 从选择中排除玩家或联盟。 这是一个问题

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

向sqlfiddle添加了一些数据。您现在可以在那里测试我的查询。一些子查询能起作用吗?我不知道其他人的情况,但我对你的问题很困惑。您的查询的输入是什么?我看到$xcoord和$ycoord是输入。这些是唯一的搜索参数吗?还有,历史意味着什么?我假设任何给定日期的历史记录中都可以有多行。每个日期都是全局状态的完整视图,还是需要将多个日期拼凑在一起形成一个完整视图?关于2和3,“t”是“team”的缩写吗?“f”是“field”的缩写还是类似的东西?tid=tribeid可以是1、2或3 fid=fieldid这没关系。我的查询输入是数字。它们用作搜索参数。历史记录表每天更新。uid=playerid,vid=villageid,aid=allianceid,日期是添加行的日期,人口是该村庄的人口。从历史表中你们可以看到玩家村是如何发展的。玩家是否加入过联盟等。向sqlfiddle添加了一些数据。您现在可以在那里测试我的查询。一些子查询能起作用吗?我不知道其他人的情况,但我对你的问题很困惑。您的查询的输入是什么?我看到$xcoord和$ycoord是输入。这些是唯一的搜索参数吗?还有,历史意味着什么?我假设任何给定日期的历史记录中都可以有多行。每个日期都是全局状态的完整视图,还是需要将多个日期拼凑在一起形成一个完整视图?关于2和3,“t”是“team”的缩写吗?“f”是“field”的缩写还是类似的东西?tid=tribeid可以是1、2或3 fid=fieldid这没关系。我的查询输入是数字。它们用作搜索参数。历史记录表每天更新。uid=playerid,vid=villageid,aid=allianceid,日期是添加行的日期,人口是该村庄的人口。从历史表中你们可以看到玩家村是如何发展的。玩家是否加入过联盟等等。
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