sql - SQL 仅提取最近修改的记录和正确的天数在 3 个表连接中
问题描述
这个查询需要做两件目前没有做的事情:
如果一个 h.name 严格等于另一个 h.name,它应该只选择最新的记录(其中 h.modify_at 是最新的)。目前它选择所有“h”)。
以下行:
(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
所以基本上我需要正确的输出,以及我自己的语句中请求的所有列。
解决方案
你需要修复你的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;
推荐阅读
- java - 在将变量作为参数之前声明变量是Java的最佳实践吗
- java - 从渲染器接收消息超时:10.000
- security - 如何使用 MD5-DES 加密密码?
- loops - PIC 汇编语言 - decfsz 循环
- laravel - 使用 Laravel 的代客 - Vue 没有完全使用它
- javascript - bcrypt 比较:未触发回调
- java - 无法解析异常错误中的参数 [0]
- r - 在一个闪亮的应用程序中,您如何明确引用 selectizeInput 中的用户选择以读取特定的 csv 文件?
- azure - 什么是 Azure SQL 数据库中的连接方法
- javascript - Firebase DB 到 HTML 表