Php 多任务SQL字符串无法工作
我得到了一些代码,需要通过三个表来显示minecraft top list的一些信息。 各表如下: 服务器Php 多任务SQL字符串无法工作,php,mysql,sql,Php,Mysql,Sql,我得到了一些代码,需要通过三个表来显示minecraft top list的一些信息。 各表如下: 服务器 id | user_id | name | information | websitename | websiteurl | postdate.. etc 这是包含服务器名称、网站信息(服务器的完整描述)等的主表 投票 在这个网站上,我允许玩家每24小时投票一次。所有投票都会插入到这个表中,其中包括用户的游戏名称(用户名)、服务器id以及投票时间 平 此表每10分钟由另一个脚本更新一次,
id | user_id | name | information | websitename | websiteurl | postdate.. etc
这是包含服务器名称、网站信息(服务器的完整描述)等的主表
投票
在这个网站上,我允许玩家每24小时投票一次。所有投票都会插入到这个表中,其中包括用户的游戏名称(用户名)、服务器id以及投票时间
平
此表每10分钟由另一个脚本更新一次,其中CronJobs使用fsock在我的web服务器上运行。
这样我就可以知道服务器是离线还是在线,有多少玩家在线,以及一次可以在线的玩家数量
在我的索引页面上,我得到了一个脚本,该脚本应该将所有三个表中的数据拉到网页上,并按照数据库顺序显示每个服务器,从获得最多投票的服务器到获得最少投票的服务器
我可以拉出每个已经在投票表中获得投票的服务器,但是如果有一个服务器还没有收到投票,它将不会被列出,这是应该的。
这是我使用的SQL代码
SELECT DISTINCT(ping.server_id), COUNT(vote.server_id) AS count, servers.id,
servers.name, servers.server_ip, ping.min_player,ping.max_player,ping.motd
FROM servers,vote,ping
WHERE servers.id = vote.server_id
AND servers.id = ping.server_id
GROUP BY servers.id
ORDER BY count DESC
LIMIT $start, $per_page
我相信这很简单,但我现在尝试了一些方法,但似乎没有任何效果。
在这一点上提到SQL并不是我的强项是个好主意
编辑
我曾尝试删除字符串中的“DISTINCT”,但由于某种原因,它会返回每个服务器的多行,这些服务器会多次显示服务器。
每个服务器只应显示一次,从上到下排序,排在得票最多到得票最少的服务器之后。首先,不要使用逗号分隔的语法,只在from子句中列出表;而是使用连接语法。如果您向我们展示一些示例输入和预期输出,将会有所帮助。您声明希望所有服务器都有投票权,这意味着您可能需要使用左联接:
Select servers.id
, Count(vote.server_id) As cnt
, servers.name
, servers.server_ip
, Min(ping.min_player) As min_player
, Max(ping_ping.max_player) As max_player
, Min(ping.motd) As Min_Motd
From servers
Left Join votes
On votes.server_id = servers.id
Left Join ping
On ping.server_id = servers.id
Group By servers.id
, servers.name
, servers.server_ip
, ping.server_id
您不清楚ping
表的结构和用途,也不清楚如果ping
表中有多行用于相同的servers.id
值,结果的性质。在上面的示例中,我猜测了用于ping.min\u player
、ping.max\u player
和ping.motd
的聚合函数。此外,我假设您确实需要所有服务器行,而不一定需要那些在ping
表中包含值的行,因此我使用了从servers
到ping
的左连接
此外,如果
servers.id
是servers
表的主键,并且由于您使用的是MySQL,您不需要在Group By中枚举它的所有列(但在其他数据库产品中可以)。因为没有说明servers.id
是否是主键,所以我列举了它们。问题是什么,您的问题是什么我的问题是,一些服务器可能尚未收到投票,因此未显示。我想能够显示所有的服务器,无论他们是否得到了投票或没有排序从上到下与服务器,得到最多的投票到最少。你需要一个左加入服务器。您应该熟悉sql连接类型、用法和语法。对不起,我从来没有真正理解过左连接和右连接。我怎么会那样做?嘿,托马斯。很抱歉反应太慢。我已经试用了你编写的代码,效果非常好!正如我在文章中所说的,我真的不擅长SQL。我确实尝试过使用左连接,但是我无法真正让它工作。我真的需要在某个地方上一些培训课来掌握它。无论如何,非常感谢你的帮助!
SELECT DISTINCT(ping.server_id), COUNT(vote.server_id) AS count, servers.id,
servers.name, servers.server_ip, ping.min_player,ping.max_player,ping.motd
FROM servers,vote,ping
WHERE servers.id = vote.server_id
AND servers.id = ping.server_id
GROUP BY servers.id
ORDER BY count DESC
LIMIT $start, $per_page
Select servers.id
, Count(vote.server_id) As cnt
, servers.name
, servers.server_ip
, Min(ping.min_player) As min_player
, Max(ping_ping.max_player) As max_player
, Min(ping.motd) As Min_Motd
From servers
Left Join votes
On votes.server_id = servers.id
Left Join ping
On ping.server_id = servers.id
Group By servers.id
, servers.name
, servers.server_ip
, ping.server_id