【问题标题】:Display all parent records except those having 4 child records显示所有父记录,但有 4 个子记录的记录除外
【发布时间】:2023-03-20 00:19:01
【问题描述】:

我需要从我的 sql 中显示父表中子记录少于 4 或没有子记录的记录,请需要 SQL 查询。

更多说明:

  1. 完全没有父级的子记录也可以,所有父级记录都应该显示
  2. 如果父记录有 1 到 3 之间的子记录,应该显示
  3. 如果父记录正好有 4 个子记录,则不应显示。

架构(一名员工的捐款不能超过 4 次)

客户端(client_id,电子邮件)

员工(employee_id,姓名)

捐赠(donation_id、employee_id、client_id)

SQL 我试过了。

SELECT * FROM employee left join 
(SELECT donation_id, employee_id, client_id, count(employee_id) as count from donation      GROUP BY employee_id HAVING count <= 4) as d
ON employee.employee_id = d.employee_id

【问题讨论】:

  • 这将有助于包含您的架构。另外,what have you tried?
  • 添加了架构,我尝试过的,总是以具有相应子记录的父记录结束,我希望显示父记录(全部),除了有 4 个子记录的记录

标签: mysql sql


【解决方案1】:

您可以只加入表格,按员工分组,然后过滤少于 4 条记录的组:

SELECT   employee.*
FROM     employee LEFT JOIN donation USING (employee_id)
GROUP BY employee_id
HAVING   COUNT(*) < 4

【讨论】:

  • 因为最简单的查询而被选中
【解决方案2】:
SELECT e.* 
  FROM employee e 
  LEFT OUTER JOIN (
    SELECT employee_id, count(parent_id) c 
    FROM donation
    GROUP BY employee_id
  ) s 
  ON s.employee_id = employee_id 
  WHERE s.c < 4 OR s.c IS NULL

并添加此索引

CREATE INDEX idx_employee_id ON donation (employee_id)

【讨论】:

    【解决方案3】:
    SELECT    a.employee_id, a.name
    FROM      employee a
    LEFT JOIN (
              SELECT   employee_id, COUNT(*) AS cnt
              FROM     donation
              GROUP BY employee_id
              ) b ON a.employee_id = b.employee_id
    WHERE     b.cnt < 4 OR b.employee_id IS NULL
    

    WHERE 子句基本上只包括有少于 4 个孩子 (b.cnt &lt; 4) 或根本没有孩子 (b.employee_id IS NULL) 的父母。

    【讨论】:

    • 它不起作用,我仍然看到有 4 个子记录的员工记录(在捐赠表中)
    • 谢谢,它现在正在工作,我会接受它作为答案,你能描述一下这个,特别是 where 子句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2011-11-06
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多