mysql select with min()不会选择所有行

imzjd6km  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(343)

背景:我是一个爱好程序员,试图为一个赛车游戏创建一个个人排行榜。这是通过一个树莓皮运行mariadb。排行榜是从另一个网站刮来的,并存储在数据库中。然后我的个人笔记本电脑接收到来自游戏的udp,并存储在pi上的同一个mariadb中。结果显示在php页面上。用户可以在php页面上选择不同的car和track组合。我想显示每个球员的最佳(最低)圈速为选定的汽车轨道组合(玩家名称是官方的玩家代号,不允许重复。它们都是独一无二的。)
像这样的select语句,我得到84行,但是我得到了所有自己的圈速,我只想显示我的最佳圈速。

$sqlstring1="SELECT * FROM laptimes WHERE track = '{$trackselect}' {$choice} AND carname LIKE '{$carselect}' ORDER BY laptime ASC";

我试着用这样的select,但是我只得到54行?我只有两个圈记录,所以从其他人的一堆圈没有显示。

$sqlstring1 = "SELECT t1.* FROM laptimes t1
JOIN (
SELECT player, MIN(laptime) AS min_laptime
FROM laptimes 
GROUP BY player
) AS t2 ON t1.player = t2.player AND t1.laptime = t2.min_laptime
WHERE track = '{$trackselect}' {$choice} AND carname LIKE '{$carselect}' 
ORDER BY laptime ASC";

我也尝试过不同的选择,比如左连接。$trackselect和$carselect是php页面上下拉列表中的值,它们似乎在这两种情况下都起作用$选项值来自php页面上的两个不同按钮。按钮1设置$choice=“”。按钮2设置$choice=“和类似于‘maskmagog’的玩家”。这只用来显示我的笔记本电脑。它似乎起作用了。
问题:为什么在第二个select中没有选择某些行?
以下是第一次选择的前5个输出:

1.  sel                 Ginetta G40 Junior  00:56.017   
2.  {DFRUK}michaeldimel Ginetta G40 Junior  00:56.149   
3.  Yorkshire Farmer    Ginetta G40 Junior  00:56.709   
4.  piquet              Ginetta G40 Junior  00:56.756   
5.  Oomph               Ginetta G40 Junior  00:56.981

第二个选择:

1.  Yorkshire Farmer    Ginetta G40 Junior  00:56.709   
2.  saya777             Ginetta G40 Junior  00:57.002   
3.  Lamb4chop™          Ginetta G40 Junior  00:57.067   
4.  Jonge               Ginetta G40 Junior  00:57.250   
5.  NsGTR35             Ginetta G40 Junior  00:57.296

正如你所见,只有“约克郡农民”幸存下来,并显示在两个选择,我不明白为什么。
以下是完整的php页面,位于pastebin:https://pastebin.com/altzfm2s
编辑:感谢下面的评论,我终于明白为什么第二个选择不起作用。它首先选择最低圈速的选手,而不考虑赛道/赛车。然后应用where,在其他赛车/赛道中设置了最低圈速的选手当然会从结果中删除。哦!:)
编辑2:看来我只能给一个答案打分了。这两种解决方案似乎都有效,非常感谢所有参与的人!我不知道一个答案是否更好/更有用/更正确。

vyswwuz2

vyswwuz21#

根据您的需求,您不需要嵌套 SELECT 的。您可以将条件添加到内部查询并使用:

SELECT player, MIN(laptime) AS min_laptime
FROM laptimes 
WHERE track = ?
    AND carname LIKE ?
    AND player LIKE ?
GROUP BY player
ORDER BY laptime ASC

如果不需要所有条件,可以动态构建sql语句字符串,只添加所需的条件。然后绑定所需数量的变量并执行语句。

x8diyxa7

x8diyxa72#

你的问题是,你的子查询返回的是一个球员的最短圈时间,无论轨道或汽车。你需要它来返回玩家在每一条赛道上每辆车的最小圈速,所以你需要改变 GROUP BY

GROUP BY player, track, carname

然后你还需要加上 track 以及 carname 到子查询 SELECT 以及 JOIN . 因此,您的查询应该如下所示:

$sqlstring1 = "SELECT t1.* FROM laptimes t1
JOIN (
SELECT player, track, carname, MIN(laptime) AS min_laptime
FROM laptimes 
GROUP BY player, track, carname
) AS t2 ON t1.player = t2.player AND t1.laptime = t2.min_laptime AND t1.track = t2.track AND t1.carname = t2.carname
WHERE track = '{$trackselect}' {$choice} AND carname LIKE '{$carselect}' 
ORDER BY laptime ASC";

相关问题