Как я могу выбрать связанные элементы в одной таблице в одном запросе SQL - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть таблица, похожая на эту:

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 ]

2 голосов
/ 12 апреля 2019

Продлите ваше условие 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'
  )
2 голосов
/ 12 апреля 2019

Если у вас есть только один «слой», вы можете сделать это:

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, поэтому могут быть некоторые проблемы с этим последним вариантом.

1 голос
/ 12 апреля 2019

Вы можете использовать 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);
0 голосов
/ 13 апреля 2019

это будет работать с функцией даты:

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

или

SELECT * FROM table WHERE date=STR_TO_DATE(DATE, '%d/%m/%Y') 
0 голосов
/ 12 апреля 2019

Вы можете просто сделать это:

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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...