Php 如何相对于行的最大值选择行

Php 如何相对于行的最大值选择行,php,mysql,Php,Mysql,我有这个疑问- SELECT d.sn,d.alias,d.CompanyID,max(checkdate),checkin FROM tbl_checkin ch right join tbl_device d on ch.sn=d.sn group by ch.sn order by max(checkdate) desc 这些选项在运行时选择随机签入 但我想要实现的是一个查询,它将根据maxcheckdate选择签入,该日期显示与maxcheckdate对应的签入 如果我能得到

我有这个疑问-

SELECT d.sn,d.alias,d.CompanyID,max(checkdate),checkin 
FROM tbl_checkin ch 
right join tbl_device d 
on ch.sn=d.sn 
group by ch.sn 
order by max(checkdate) desc
这些选项在运行时选择随机签入

但我想要实现的是一个查询,它将根据maxcheckdate选择签入,该日期显示与maxcheckdate对应的签入


如果我能得到答案,我将不胜感激。如果我理解正确,您只需返回1行,请使用以下限制:

SELECT d.sn,d.alias,d.CompanyID,max(checkdate),checkin 
FROM tbl_checkin ch 
RIGHT JOIN tbl_device d 
ON ch.sn=d.sn 
GROUP BY ch.sn 
ORDER BY MAX(checkdate) DESC
LIMIT 1

要获取与MAXcheckdate在同一行上对应的签入值,必须创建子查询或附加的左联接以过滤tbl_checkin.checkin的值。这在其他地方得到了回答,因为这是一个常见的难题:

在任何情况下,如果我输入了以下内容,可能需要进行一些小的修改:

SELECT d.sn,d.alias,d.CompanyID,ch.checkdate,ch.checkin 
FROM tbl_device d
    LEFT JOIN tbl_checkin ch on ch.sn=d.sn 
    LEFT JOIN tbl_checkin ch2 on ch2.sn=d.sn AND ch2.checkdate > ch.checkdate
WHERE ch2.checkdate IS NULL
ORDER BY ch.checkdate DESC

注意:如果有两个ch行具有相同的MAXcheckdate,则ch.checkin仍然可以是这两行中的任意一行。

否,不是限制。我想他是说,因为maxcheckdate列,相应的签入值不是来自同一行。如果你理解正确,那么我很可能会暗示你的能力正在接近psychic@JayBlanchard,因为返回的ch行是任何匹配行,而MAX仅是所有行的MAX。如果没有聚合器强制签入到特定的值,那么它本质上是随机的。您可以看到我的示例,即执行额外的左联接以强制第一个左联接只返回最大值或等于最大值的行。@草莓,您可能在SQL的所有其他版本中都是对的,但MySQL实际上鼓励他们扩展GROUP BY以进行优化:。所以,我不是混为一谈,只是利用了MySQL的特性。如果不能保证MAXcheckdate是唯一的,但您只需要一行,那么仍然允许使用GROUP BY来确保每个设备只有一行签入/签入日期。否则,您必须使用ORDER BY checkdate DESC LIMIT 1左键连接一个子查询,MySQL也无法优化该子查询[cont...[cont]但是,在这种情况下,提问者没有给人这样的印象,即MAXcheckdate可以匹配多行,因此在不需要它的情况下,我将其从查询中删除,认为它是不必要的。
SELECT d.sn,d.alias,d.CompanyID,ch.checkdate,ch.checkin 
FROM tbl_device d
    LEFT JOIN tbl_checkin ch on ch.sn=d.sn 
    LEFT JOIN tbl_checkin ch2 on ch2.sn=d.sn AND ch2.checkdate > ch.checkdate
WHERE ch2.checkdate IS NULL
ORDER BY ch.checkdate DESC