簡體   English   中英

SQL從父表返回條件與子表的另一個子表匹配的所有行

[英]Sql return all rows from parent table where criteria match from another child of a child table

我有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 |
+-----------------+

我嘗試了分組方式,但無法獲得想要的結果。

謝謝

這是您要查找的查詢:

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數據庫可以測試此查詢,但它應該可以工作;-)

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()
)
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()

我不確定您想要什么,但是請嘗試以下操作:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM