我有一个像这样的桌子:
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查询中实现?
答案 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')