我有这个查询

 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


这有点武断,但至少您只获得一个记录,并且每次都获得相同的记录。

或者,就您而言,您是否应该获得两条记录,因为它们共享相同的时间戳记?

09-26 03:48