我需要提供一个过滤器,以按保险最早到期日期对“拥有很多”合同的企业进行排序。
我尝试过:
SELECT
sc.supplier_id,
b.business_name,
MIN(c.insurance_expiry) as contract_expiry
FROM ph_supplier_completed sc
INNER JOIN ph_business b ON sc.supplier_business_id = b.business_id
LEFT JOIN ph_supplier_insurance c ON sc.supplier_id = c.supplier_id
ORDER BY
sc.supplier_id DESC
但这似乎并不正确-尽管它确实为我在其相应列中提供了最早的失效日期,但当我有1800〜供应商和1700〜有保险记录时,它仅返回1行
我需要返回一个包含1800多个供应商的列表,并在该列中显示最早的保险到期日期(如果有的话)
答案 0 :(得分:1)
您缺少GROUP BY
:
SELECT sc.supplier_id, b.business_name,
MIN(c.insurance_expiry) as contract_expiry
FROM ph_supplier_completed sc JOIN
ph_business b
ON sc.supplier_business_id = b.business_id LEFT JOIN
ph_supplier_insurance c
ON sc.supplier_id = c.supplier_id
GROUP BY sc.supplier_id, b.business_name
ORDER BY contract_expiry;
在大多数数据库中,包括具有默认设置的更新版本的MySQL,您的查询只会因语法错误而失败。
这是一个聚合查询(由于MIN()
),但是前两列未聚合且不在GROUP BY
子句中。