我有这个查询
select vrs.label as label1,
vrhs.label as label2,
vrh.inserted_at
from vehicule_request vr
inner join vehicule_request_history vrh
on vr.vehicule_request_id = vrh.vehicule_request_id
inner join vehicule_request_status vrs
on vr.vehicule_request_status_id = vrs.vehicule_request_status_id
inner join vehicule_request_status vrhs
on vrh.vehicule_request_status_id = vrhs.vehicule_request_status_id
where vrh.vehicule_request_id = 10133;
显示:
+----------+------------------------+---------------------+
| label1 | label2 | inserted_at |
+----------+------------------------+---------------------+
| Traitée | En cours de validation | 2011-10-11 14:17:32 |
| Traitée | Demande d'informations | 2011-10-11 14:29:04 |
| Traitée | En cours de validation | 2011-10-11 14:32:57 |
| Traitée | En cours de traitement | 2011-10-11 14:33:57 |
| Traitée | Traitée | 2011-10-11 14:17:32 |
+----------+------------------------+---------------------+
但是首先我希望它仅显示最后插入的行
| Traitée | En cours de validation | 2011-10-11 14:32:57 |
因此,我尝试了此查询
select
vrs.label as label1, vrhs.label as label2, vrh.inserted_at
from
vehicule_request vr
inner join
vehicule_request_history vrh
on vr.vehicule_request_id = vrh.vehicule_request_id
inner join
vehicule_request_status vrs
on vr.vehicule_request_status_id = vrs.vehicule_request_status_id
inner join
vehicule_request_status vrhs
on vrh.vehicule_request_status_id = vrhs.vehicule_request_status_id
where
vrh.vehicule_request_id = 10133
group by
vrh.vehicule_request_id
但它显示另一行:
+----------+------------------------+---------------------+
| label1 | label2 | inserted_at |
+----------+------------------------+---------------------+
| Traitée | En cours de validation | 2011-10-11 14:17:32 |
+----------+------------------------+---------------------+
如何按
inserted_at
降序告诉它顺序?其次,我想添加一个子句以仅显示具有不同标签的行。
它应该只显示以下行:
| Traitée | En cours de validation | 2011-10-11 14:32:57 |
逻辑将是:如果最后插入的行的label2与label1不同,则显示该行。
更新:很抱歉误导我,我不得不改写这个错误陈述的问题。现在,我可以使用查询获取最后插入的行:
select vrs.label as label1,
vrhs.label as label2,
vrh.inserted_at
from vehicule_request vr
inner join vehicule_request_history vrh
on vr.vehicule_request_id = vrh.vehicule_request_id
inner join vehicule_request_status vrs
on vr.vehicule_request_status_id = vrs.vehicule_request_status_id
inner join vehicule_request_status vrhs
on vrh.vehicule_request_status_id = vrhs.vehicule_request_status_id
where vrh.vehicule_request_id = 10133
order by vrh.inserted_at desc, vrhs.label desc
limit 1;
它显示:
+----------+------------------------+---------------------+
| label1 | label2 | inserted_at |
+----------+------------------------+---------------------+
| Traitée | En cours de traitement | 2011-10-11 14:33:57 |
+----------+------------------------+---------------------+
但是,我想确保如果该行的两个标签恰好相同,则根本不显示该行。
现在,我只能通过向投影添加标志
(vrh.vehicule_request_status_id != vr.vehicule_request_status_id) as is_error,
来显示错误所在:+----------+----------+------------------------+---------------------+
| is_error | label1 | label2 | inserted_at |
+----------+----------+------------------------+---------------------+
| 1 | Traitée | En cours de traitement | 2011-10-11 14:33:57 |
+----------+----------+------------------------+---------------------+
更新:
vrh.vehicule_request_id = 10133
子句仅在此处用于避免大量显示。但应将其删除。因此,实际上不可能使用limit 1
。 最佳答案
MySQL确实允许您GROUP BY
一个字段,然后SELECT
不同的字段。
但是,这可以从组中进行任意选择。从理论上讲(尽管在实践中不太可能),每一列可能来自不同的记录。仅当组中的所有记录具有相同的值时才真正有用(允许您按主键而不是每列进行分组)。
在正常使用中,列应位于GROUP BY
中或应位于聚合函数中,例如MAX()
等。
如评论中所述,您似乎只需要ORDER BY vrh.inserted_at LIMIT 1
。但是即使如此,示例数据中的两个inserted_at
仍然有两行,因此在排序时您还需要其他列。
select
vrs.label as label1, vrhs.label as label2, vrh.inserted_at
from
vehicule_request vr
inner join
vehicule_request_history vrh
on vr.vehicule_request_id = vrh.vehicule_request_id
inner join
vehicule_request_status vrs
on vr.vehicule_request_status_id = vrs.vehicule_request_status_id
inner join
vehicule_request_status vrhs
on vrh.vehicule_request_status_id = vrhs.vehicule_request_status_id
where
vrh.vehicule_request_id = 10133
order by
vrh.inserted_at,
vrhs.label
limit
1
这有点武断,但至少您只获得一个记录,并且每次都获得相同的记录。
或者,就您而言,您是否应该获得两条记录,因为它们共享相同的时间戳记?