我得到了一些需要查看三个表格的代码,以显示一个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'但由于某种原因它返回每个服务器的多行,这些服务器多次显示服务器。 每个服务器只应显示一次,在获得最多票数的服务器之后从上到下排序。
答案 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_player
,ping.max_player
和ping.motd
的聚合函数。另外,我假设你确实想要所有服务器行,而不一定是那些包含ping
表中值的那些,所以我使用了从servers
到ping
的左连接。
此外,如果servers.id
是servers
表的主键,并且因为您使用的是MySQL,则不需要枚举Group By中的所有列(但是你会在其他数据库产品)。由于没有说明servers.id
是否是主键,我列举了它们。