как вы можете устранить перестановки между столбцами в MySQL

#mysql #sql #database

#mysql #sql #База данных

Вопрос:

у меня есть столбцы таблицы один (idprocess), указывающие на столбцы два (idporcess1) и указывающие на дерево столбцов (idprocess2).

 id    idprocess        idporcess1    idprocess2
1      15                  16          17                  <==  A
2      15                  16          19                  <==  B
3      15                  20          23
4      14                  16          17
6      16                  15          80                  <== C
7      17                  15           49                 <== D
8      23                  16           20                 <== E    
  

Мне нужен SQL-запрос, который возвращает следующее: строка c и строка D, поэтому с номером idprocess(16) и idprocess(17)

потому что строка c: idprocess(16) снова ссылается на ipdprocess1(15), потому что строка c: idprocess(17) ссылается на ipdprocess1(15)

пожалуйста, помогите, я хочу только создать циклическую ссылку в дереве

Комментарии:

1. Что вы подразумеваете под «перестановкой»?

2. перестановка между столбцами (idprocess и iprocess1) и (idprocess и iprocess2)

3. Почему выбираются эти две строки? Ваши критерии неясны.

4. вау — трудно расшифровать .. я думаю, это означает иерархический запрос.

5. Вы пытаетесь определить циклические ссылки? Другими словами, idprocess 15 указывает на idprocess1 16, а idprocess 16 указывает на idprocess1 15.

Ответ №1:

Если вы рады найти строки, в которых первые два столбца переставлены, это сделает работу:

 SELECT *
  FROM my_tbl t
 WHERE EXISTS (SELECT 1 FROM my_tbl t1 WHERE t1.idprocess = t.idprocess1 AND t1.idprocess1 = t.idprocess)
 ORDER BY t.id;
  

Альтернативная интерпретация:
Если вы хотите, чтобы все строки, в которых idprocess1 было указано idprocess ранее (before = меньший идентификатор), тогда вы можете:

 SELECT *
  FROM my_tbl t
 WHERE EXISTS (SELECT 1 FROM my_tbl t1 WHERE t1.id < t.id AND t1.idprocess = t.idprocess1)
 ORDER BY t.id;
  

Однако вы бы не назвали это «перестановкой».

Комментарии:

1. @AbdelillahFarka: в моей первой версии была ошибка, теперь она должна быть исправлена.

2. @AbdelillahFarka: Извините, я не понимаю. Если вам трудно выразить то, что вам нужно, пожалуйста, отредактируйте свой вопрос с помощью примера, который показывает точный результат, который вы ищете.

Ответ №2:

Вопрос немного неоднозначный, но я попытался разобраться в нем самостоятельно и подготовил следующий запрос:

 SELECT * 
FROM TEMP
where C2 IN ( Select C2 FROM TEMP group by C2 having count(C2) > 1 )
OR C3 IN ( Select C3 FROM TEMP group by C3 having count(C3) > 1 )