Php 多任务SQL字符串无法工作

Php 多任务SQL字符串无法工作,php,mysql,sql,Php,Mysql,Sql,我得到了一些代码,需要通过三个表来显示minecraft top list的一些信息。 各表如下: 服务器 id | user_id | name | information | websitename | websiteurl | postdate.. etc 这是包含服务器名称、网站信息(服务器的完整描述)等的主表 投票 在这个网站上,我允许玩家每24小时投票一次。所有投票都会插入到这个表中,其中包括用户的游戏名称(用户名)、服务器id以及投票时间 平 此表每10分钟由另一个脚本更新一次,

我得到了一些代码,需要通过三个表来显示minecraft top list的一些信息。 各表如下:

服务器

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