多表SQL字符串不起作用

时间:2012-11-14 22:20:42

标签: php mysql sql

我得到了一些需要查看三个表格的代码,以显示一个Minecraft顶级列表的一些信息。 表格如下:

服务器

id | user_id | name | information | websitename | websiteurl | postdate.. etc

这是包含服务器名称,网站信息(服务器的完整描述)等的主表。

表决

id | server_id | username | ipaddress | votetimestamp

在网站上我允许玩家每24小时投票一次。所有投票都会插入此表中,其中包含用户游戏名称(用户名),服务器ID和投票时间。

id | server_id | min_player | max_player | motd | pingtimestamp

这个表每隔10分钟由另一个脚本更新,其中CronJobs使用fsock在我的Web服务器上运行。 这样做我可以看出服务器是离线还是在线,在线有多少玩家以及一次可以在线的玩家数量。

在我的索引页面上,我得到了一个脚本,该脚本应该将所有三个表中的数据提取到网页上,并在获得最多选票的服务器得到最少票数的服务器之后以数据库顺序显示每个服务器。 / p>

我可以提取已经在投票表中投票的每个服务器,但是如果有一个服务器没有收到投票但它不会被列出应该。 这是我使用的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'但由于某种原因它返回每个服务器的多行,这些服务器多次显示服务器。 每个服务器只应显示一次,在获得最多票数的服务器之后从上到下排序。

1 个答案:

答案 0 :(得分:0)

首先,不要使用逗号分隔的语法,只需列出From子句中的表;而是使用Join语法。如果您向我们展示一些样本输入和预期输出,将会有所帮助。你声明你想要所有服务器,无论他们是否有投票意味着你可能需要使用左连接:

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_playerping.max_playerping.motd的聚合函数。另外,我假设你确实想要所有服务器行,而不一定是那些包含ping表中值的那些,所以我使用了从serversping的左连接。

此外,如果servers.idservers表的主键,并且因为您使用的是MySQL,则不需要枚举Group By中的所有列(但是你会在其他数据库产品)。由于没有说明servers.id是否是主键,我列举了它们。