背景:我是一个爱好程序员,试图为一个赛车游戏创建一个个人排行榜。这是通过一个树莓皮运行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:看来我只能给一个答案打分了。这两种解决方案似乎都有效,非常感谢所有参与的人!我不知道一个答案是否更好/更有用/更正确。
2条答案
按热度按时间vyswwuz21#
根据您的需求,您不需要嵌套
SELECT
的。您可以将条件添加到内部查询并使用:如果不需要所有条件,可以动态构建sql语句字符串,只添加所需的条件。然后绑定所需数量的变量并执行语句。
x8diyxa72#
你的问题是,你的子查询返回的是一个球员的最短圈时间,无论轨道或汽车。你需要它来返回玩家在每一条赛道上每辆车的最小圈速,所以你需要改变
GROUP BY
到然后你还需要加上
track
以及carname
到子查询SELECT
以及JOIN
. 因此,您的查询应该如下所示: