Php 从数据库中获取最新的条目
我有四个表格,分别是分配表、用户表、车辆表和燃油表。我想做一个查询,返回唯一的行(也就是说,除了users表之外,每个表应该只有一个唯一的ID) 我希望查询返回最新的条目(比如最后一个条目) 下面是我当前的查询,但它返回找到的第一行,而不是最后一行Php 从数据库中获取最新的条目,php,mysql,database,Php,Mysql,Database,我有四个表格,分别是分配表、用户表、车辆表和燃油表。我想做一个查询,返回唯一的行(也就是说,除了users表之外,每个表应该只有一个唯一的ID) 我希望查询返回最新的条目(比如最后一个条目) 下面是我当前的查询,但它返回找到的第一行,而不是最后一行 Select distinct v.vname, v.year, v.make, v.model, v.vid, v.fueltype, f.fID, f.meter,
Select distinct
v.vname,
v.year,
v.make,
v.model,
v.vid,
v.fueltype,
f.fID,
f.meter,
f.date,
a.driverID,
a.dateassigned,
u.uid,
u.name,
u.surname
from
vehicles as v,
assigns as a,
users as u,
fuel as f
where
v.vid = a.vID
and
a.driverID = u.id
and
v.vid = f.vID
group by
v.vid
order by
f.date desc
如何使用这些表从数据库中获取最后一个条目 请尝试以下有限制的代码:
Select distinct
v.vname,
v.year,
v.make,
v.model,
v.vid,
v.fueltype,
f.fID,
f.meter,
f.date,
a.driverID,
a.dateassigned,
u.uid,
u.name,
u.surname
from
vehicles as v,
assigns as a,
users as u,
fuel as f
where
v.vid = a.vID
and
a.driverID = u.id
and
v.vid = f.vID
group by
v.vid
order by
f.date desc
limit 1
有什么问题,请留言
Select
v.vname,
v.year,
v.make,
v.model,
v.vid,
v.fueltype,
f.fID,
f.meter,
f.date,
a.driverID,
a.dateassigned,
u.uid,
u.name,
u.surname
from
vehicles as v,
assigns as a,
users as u,
fuel as f
where
v.vid = a.vID
and
a.driverID = u.id
and
v.vid = f.vID
order by
v.id desc
limit 1
如果您的表具有id作为主键,那么上面的SQL将起作用。我认为这不是您现在想要的,但我只想在下次创建数据库时将其扔到那里。这件事很容易通过laravel的方法解决。只需创建两个数据库字段
created\u at
和updated\u at
这两个字段都是时间戳,created_at
在您创建项目时更新,而updated_at
在您尝试更新数据库中的任何字段时更新。
通过这种方式,您可以在创建或更新数据库时获取数据库中的最新记录
由于两个时间戳相互碰撞的可能性很小,几乎没有,因此您几乎总是会得到一个结果。您还可以根据创建或更新的时间戳以这种方式对记录进行排序 我推测你想要的东西大致如下:
SELECT
v.vname,
v.year,
v.make,
v.model,
v.vid,
v.fueltype,
f1.fID,
f1.meter,
f1.date,
a.driverID,
a.dateassigned,
u.uid,
u.name,
u.surname
FROM vehicles v
INNER JOIN assigns a
ON v.vid = a.vID
INNER JOIN users u
ON a.driverID = u.id
INNER JOIN fuel f1
ON v.vid = f1.vID
INNER JOIN
(
SELECT vID, MAX(date) AS max_date
FROM fuel
GROUP BY vID
) f2
ON f1.vID = f2.vID AND f1.date = f2.max_date
ORDER BY
f1.date DESC;
此查询只是对子查询进行附加联接,该子查询为每辆车查找最近的日期。这将通过删除每辆车的所有非最新记录来限制当前查询
请注意,我已将老式隐式联接转换为显式内部联接。这是目前编写SQL查询的首选方法。在选择其他非聚合列时,千万不要执行
分组方式(除非其他列在功能上依赖于v.vid
,我认为这里不是这种情况)。它返回一行,该行也不包含该车辆视频的数据。哪列确定记录的年龄?由于MySQL 5.6,GROUP BY和ORDER BY的结果是随机的。这只返回一行。而且它不是数据库中的最后一个条目。基本上,我只想从燃油表中为每辆加满燃油的车辆获取最后一个条目。因此,燃油表中有大量车辆燃油日志(一辆车出现不止一次)。因此,假设车辆的vid为43(vid是车辆表中的车辆id),并且在燃油表中,该vid可能出现多次。我只想得到这辆车的最后一个条目。。。但我不是在寻找这辆车的最后一个条目——燃料表中所有车辆的最后一个条目——你完全没有抓住问题的关键。现有查询需要修改。该查询是GET。这不是一个帖子。所以我不能使用最后一个插入ID()。另外,我如何从这4个表中查询数据?我在这里考虑了应显示最新的v.id条目,因为没有提到必须显示哪一个最新的id燃油表有一个日期列,用于存储车辆加注的日期。每辆车的日期绝对不会相撞。。。这就是为什么在我的查询中,我按f.date对它们进行排序。这将返回一个不应该发生的空结果,我认为我的逻辑对于您尝试执行的操作是正确的。我猜您的数据有问题。好的,让我发布模式,然后您可以尝试从那里运行代码,您介意吗?在此处设置演示:。添加一些我们可能使用的数据。哦,嘿,很抱歉没有重新检查我是如何写代码的(因为我没有复制-粘贴它)。。。我写的是u.uid而不是u.id。它确实可以工作,但它会为一辆车获得重复的行。
SELECT
v.vname,
v.year,
v.make,
v.model,
v.vid,
v.fueltype,
f1.fID,
f1.meter,
f1.date,
a.driverID,
a.dateassigned,
u.uid,
u.name,
u.surname
FROM vehicles v
INNER JOIN assigns a
ON v.vid = a.vID
INNER JOIN users u
ON a.driverID = u.id
INNER JOIN fuel f1
ON v.vid = f1.vID
INNER JOIN
(
SELECT vID, MAX(date) AS max_date
FROM fuel
GROUP BY vID
) f2
ON f1.vID = f2.vID AND f1.date = f2.max_date
ORDER BY
f1.date DESC;