Sql从父表中返回所有行,其中条件与子表的另一个子项匹配

时间:2014-08-26 18:44:32

标签: mysql sql

我有3张桌子:

Doc_group

  • ID
  • 名称

DOC_TYPE

  • ID
  • doc_group_id
  • 名称

文档

  • ID
  • doc_type_id
  • 名称
  • 日期

我想只检索Doc_group中的行,其中所有文档的日期都少于90天。

实施例: 的 Doc_group

+-----------------+
| id | name       |
+-----------------+
| 1 | doc_group_1 |
+-----------------+
| 2 | doc_group_2 |
+-----------------+
| 3 | doc_group_3 |
+-----------------+

DOC_TYPE

+--------------------------------+
| id| name        | doc_group_id | 
+--------------------------------+
| 1 | doc_type_1  | 1            |
+--------------------------------+
| 2 | doc_type_2  | 1            |
+--------------------------------+
| 3 | doc_type_2  | 2            |
+--------------------------------+

文档

+---------------------------------------+
| id| name   | doc_type_id  | date      |
+---------------------------------------+
| 1 | doc_1  | 1            |01/10/2012 |
+---------------------------------------+
| 2 | doc_2  | 2            |01/9/2012  |
+---------------------------------------+
| 3 | doc_3  | 3            |01/10/2012 |
+---------------------------------------+
| 4 | doc_4  | 3            |26/07/2014 |
+---------------------------------------+

结果: 只应返回doc_group_1,因为其所有文档的时间都少于90天。 doc_group_2不符合doc_4不少于90天的条件 的 Doc_group

+-----------------+
| id | name       |
+-----------------+
| 1 | doc_group_1 |
+-----------------+

我尝试过分组,但我无法得到我想要的结果。

由于

4 个答案:

答案 0 :(得分:2)

以下是您正在寻找的查询:

SELECT DG.*
FROM Doc_group DG
WHERE NOT EXISTS (SELECT D.id
                 FROM Doc D
                 WHERE D.doc_group_id = DG.id
                    AND D.date < DATEADD(DAY, -90, GETUTCDATE()))

这是T-SQL的解决方案,我对MySQL版本不太确定。 希望这对你有所帮助。

快速搜索后,这是查询的MySQL版本:

 SELECT DG.*
    FROM Doc_group DG
    WHERE NOT EXISTS (SELECT D.id
                     FROM Doc D
                     WHERE D.doc_group_id = DG.id
                        AND D.date < DATE_SUB(CURDATE(), INTERVAL 90 DAY))

我没有任何MySQL数据库来测试这个查询,但它应该可以工作; - )

答案 1 :(得分:1)

select dg.id, dg.name
from Doc_group dg 
where dg.id not in
(
    select d.doc_group_id 
    from Doc d 
    where d.date NOT BETWEEN DATEDIFF(NOW() - 90 days) AND NOW()
)

答案 2 :(得分:1)

SELECT *
FROM Doc_group DG 
INNER JOIN Type_group TG   ON  DG.ID = TG.doc_group_id
INNER JOIN Doc        D    ON  DG.doc_group_id = D.doc_group_id
WHERE D.date BETWEEN NOW() - INTERVAL 90 DAY AND NOW()

答案 3 :(得分:0)

我不确定你想要什么, 但试试这个:

SELECT dg.*
FROM Doc_group AS dg
  INNER JOIN Doc AS d ON dg.id = d.doc_group_id
WHERE d.date BEETWEEN DATEDIFF(NOW() - 90 days) AND NOW()