2016-07-21 5 views
1

Предположим, у меня есть следующая таблица:Получить строк по транзитивности в MySQL

Images 

|id | similarTo| 
|---|----------| 
|1 | 2  | 
|2 | 3  | 
|--------------| 

Где similarTo является foriegn ключом к идентификатору. То, что я хочу, - это запрос, который может получить переходное закрытие id до двух уровней в обоих направлениях. Другими словами, то, что мы имеем: A -> B ---> C , а также C -> B -> A

И поэтому в данном случае я хотел бы его вернуть:

Given 1: 2,3 
Given 2: 1,3 
Given 3: 1,2 

По существу, я сохраняю функцию (изображение A) аналогично (изображение B) в таблице. Эта функция работает в обоих направлениях, поэтому, если A похож на B, тогда B похож на A. Теперь мне нужен запрос, который может найти все изображения, похожие на заданное изображение, до двух уровней/шагов ... (то есть, если учитывая A -> B -> C -> D, теперь, если я хочу, чтобы найти все изображения, похожие на A, он вернется B, C)

ответ

1

Может быть запрос, как показано ниже:

SELECT 
id, 
similarTo 
From images 

UNION ALL 

SELECT 
t1.id, 
t2.similarTo 
FROM images t1 
INNER JOIN images t2 ON t1.similarTo = t2.id AND t1.id < t2.id 

DEMO

Второй запрос на самом деле порождает transitive отношение. И первый получает все определенные отношения в вашей таблице.

Выход:

вы получите выход, как показано ниже:

| id | similarTo | 
|----|-----------| 
| 1 |   2 | 
| 2 |   3 | 
| 1 |   3 | 

EDIT:

Конкретную id говорят id=2:

SELECT 
id, 
similarTo 
From images 
WHERE id=2 or similarTo=2 

UNION ALL 

SELECT 
t1.id, 
t2.similarTo 
FROM images t1 
INNER JOIN images t2 ON t1.similarTo=2 AND t2.id =2 AND t1.id < t2.id 

DEMO

+0

Отлично, как бы я запросил конкретный идентификатор, скажем 2? (так, чтобы он возвращался, например, 1,3) –

+0

Не могли бы вы проверить обновленный ответ? – 1000111

+0

Добро пожаловать. – 1000111

 Смежные вопросы

  • Нет связанных вопросов^_^