首页 > 解决方案 > SQL 仅提取最近修改的记录和正确的天数在 3 个表连接中

问题描述

这个查询需要做两件目前没有做的事情:

  1. 如果一个 h.name 严格等于另一个 h.name,它应该只选择最新的记录(其中 h.modify_at 是最新的)。目前它选择所有“h”)。

  2. 以下行:(EXTRACT(epoch FROM (SELECT (NOW() - date_cible)))/86400)::INT AS retard应返回在天数之前或之上的date_cible天数。目前它确实给出了一个整数作为天数,但它是不正确的。

我基本上是在一个几乎完成的项目中加入,并且必须与实体一起工作,非常感谢任何帮助。

SELECT 
  h.target_date,
  h.flux_id,
  h.modify_at,
  f.description,
  d.nom,
  d.date_creation,
  f.ordre,
  f.name,
COALESCE(h.target_date,d.deadline) AS date_cible,
(EXTRACT(epoch FROM (SELECT (NOW() - date_cible)))/86400)::INT  AS retard
FROM
public.flux_historique AS h 
LEFT JOIN public.flux as f 
INNER JOIN public.document as d
ON d.id = :docId
ON h.flux_id = f.id 
      WHERE
         f.id_system_droit_id = d.id_system_droit_id

:docId 是一个 Symfony 参数。

此查询的示例数据:

"2019-12-10 10:39:59"   15  "dzd"   "Rapport d'Evaluation ANTE" "2019-11-15 14:05:51"   1   "Lecture"   "2019-12-10 10:39:59"   2179
"2019-12-22 10:39:59"   121 "Naaaaaaan" "Rapport d'Evaluation ANTE" "2019-11-15 14:05:51"   2   "Relecture" "2019-12-22 10:39:59"   2179
"2019-12-23 10:39:59"   121 "Naaaaaaan" "Rapport d'Evaluation ANTE" "2019-11-15 14:05:51"   2   "Relecture" "2019-12-23 10:39:59"   2179
"2019-12-24 10:39:59"   121 "Naaaaaaan" "Rapport d'Evaluation ANTE" "2019-11-15 14:05:51"   2   "Relecture" "2019-12-24 10:39:59"   2179
"2019-12-25 10:39:59"   121 "Naaaaaaan" "Rapport d'Evaluation ANTE" "2019-11-15 14:05:51"   2   "Relecture" "2019-12-25 10:39:59"   2179
"2019-12-26 10:39:59"   121 "Naaaaaaan" "Rapport d'Evaluation ANTE" "2019-11-15 14:05:51"   2   "Relecture" "2019-12-26 10:39:59"   2179
"2019-12-27 10:39:59"   122 "non"   "Rapport d'Evaluation ANTE" "2019-11-15 14:05:51"   3   "Introduction"  "2019-12-27 10:39:59"   2179
"2019-12-28 10:39:59"   122 "non"   "Rapport d'Evaluation ANTE" "2019-11-15 14:05:51"   3   "Introduction"  "2019-12-28 10:39:59"   2179
"2019-12-29 10:39:59"   122 "non"   "Rapport d'Evaluation ANTE" "2019-11-15 14:05:51"   3   "Introduction"  "2019-12-29 10:39:59"   2179
"2019-12-30 10:39:59"   122 "non"   "Rapport d'Evaluation ANTE" "2019-11-15 14:05:51"   3   "Introduction"  "2019-12-30 10:39:59"   2179

示例正确输出:

1   "Lecture"   "dzd"   "2020-02-03 00:00:00"   2179
2   "Relecture" "Naaaaaaan" "2020-02-03 00:00:00"   2179
3   "Introduction"  "non"   "2020-02-03 00:00:00"   2179
4   "Introducure"   "puis si"   "2020-02-03 00:00:00"   2179

所以基本上我需要正确的输出,以及我自己的语句中请求的所有列。

标签: sqlpostgresql

解决方案


你需要修复你的JOIN条件。学习交错ON从句并将条件放在正确的ON从句中。如果您不想过滤(如 建议的那样LEFT JOIN),则需要始终如一地使用它。

然后得到一行,使用DISTINCT ON

SELECT DISTINCT ON (h.flux_id)
       h.target_date, h.flux_id, h.modify_at, f.description,
       d.nom, d.date_creation,
       f.ordre, f.name,
       COALESCE(h.target_date, d.deadline) AS date_cible,
       (EXTRACT(epoch FROM (SELECT (NOW() - date_cible)))/86400)::INT  AS retard
FROM public.flux_historique h LEFT JOIN
     public.flux f 
     ON h.flux_id = f.id LEFT JOIN
     public.document as d
     ON d.id_system_droit_id = f.id_system_droit_id AND
        d.id = :docId
ORDER BY h.flux_id, h.modify_at DESC;

推荐阅读