1

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

服务器

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 服务器上运行。这样做我可以知道服务器是离线还是在线,有多少玩家在线以及一次可以有多少玩家在线。

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

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

4

1 回答 1

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_player聚合ping.max_player函数ping.motd。此外,我假设您确实需要所有服务器行,而不一定是ping表中包含值的行,因此我使用了左连接 from serversto ping

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

于 2012-11-14T23:05:27.053 回答