如何在一个SQL查询中选择同一表中的相关项目

时间:2019-04-12 17:56:33

标签: mysql sql

我有一个像这样的桌子:

id | date       | related_id
 1   2018-01-01
 2   2018-01-01
 3   2018-01-02
 4   2018-01-05   2
 5   2018-01-06

查询SELECT * FROM table WHERE date='2018-01-01'将产生以下结果:

id | date       | related_id
 1   2018-01-01
 2   2018-01-01
 4   2018-01-05   2

如何在一个MySql查询中实现?

5 个答案:

答案 0 :(得分:2)

将您的WHERE条件延长到related_id的日期:

SELECT * FROM table t 
WHERE 
  t.date = '2018-01-01'
  OR 
  (SELECT date FROM table WHERE id = t.related_id) = '2018-01-01'

或具有自我加入的能力:

SELECT t.* 
FROM table t LEFT JOIN table tt
ON tt.id = t.related_id
WHERE 
  t.date = '2018-01-01'
  OR 
  tt.date = '2018-01-01'

或带有EXISTS:

SELECT t.*
FROM table t
WHERE 
  t.date = '2018-01-01' 
  OR
  EXISTS (
    SELECT 1 FROM table  
    WHERE id = t.related_id AND date = '2018-01-01'
  )

答案 1 :(得分:2)

如果只有一个“层”,则可以执行以下操作:

SELECT t.*
FROM theTable AS t
LEFT JOIN theTable AS rt ON t.related_id = rt.id
WHERE t.`date` = searchValue OR rt.`date` = searchValue
;

如果层数不确定,并且您拥有MySQL 8.0,则可以使用CTE:

WITH RECURSIVE myCte AS (
SELECT * FROM theTable WHERE `date` = searchValue
UNION
SELECT t.* 
FROM theTable AS t 
INNER JOIN myCTE ON t.related_id = myCTE.id
)
SELECT * FROM myCTE;

免责声明:我对MS-SQL CTE更为熟悉,因此后一种选择可能会有一些问题。

答案 2 :(得分:1)

您可以使用EXISTS

SELECT t.*
FROM table t
WHERE t.date = '2018-01-01' OR
      EXISTS (SELECT 1 FROM table t1 WHERE t.related_id = t1.id);

答案 3 :(得分:0)

您可以简单地执行以下操作:

SELECT table.* FROM table LEFT JOIN table related
ON table.related_id = related.id
WHERE
    table.date = '2018-01-01'
    OR related.date = '2018-01-01';

答案 4 :(得分:0)

这将与日期功能一起使用:

SELECT * FROM table WHERE date=DATE('2018-01-01');

SELECT * FROM table WHERE date=STR_TO_DATE(DATE, '%d/%m/%Y')