Hier ist meine Tabellenstruktur:

// mytable
+----+---------+
| id | related |
+----+---------+
| 1  | NULL    |
| 2  | 1       |
+----+---------+

Jetzt muss ich die Zeile mit id = 1 und alle Zeilen mit related = 1 auswählen. Hier ist meine Frage:

select m1.*
from mytable m1
left join mytable m2 on m1.id = m2.related
where m1.id = 1

Es wird jedoch nur die erste Zeile zurückgegeben. Was ist los?

1
Martin AJ 17 Apr. 2018 im 17:47

5 Antworten

Beste Antwort

Du kannst tun:

select t.*
from mytable t
where 1 in (id, related);

Es ist keine Selbstverbindung erforderlich.

BEARBEITEN:

Wenn Sie Leistung wünschen, schreiben Sie die Abfrage wie folgt:

select t.*
from mytable t
where id = 1
union all
select t.*
from mytable t
where related = 1;

Definieren Sie zwei Indizes für mytable(id) und mytable(related).

2
Gordon Linoff 18 Apr. 2018 im 02:40

Wenn ich es richtig verstanden habe, suchen Sie danach:

select m1.*
from mytable m1 where m1.id = 1 or m1.related = 1
2
apomene 17 Apr. 2018 im 14:50

Sie müssen Inner Join verwenden.

select m1.*
from mytable m1
inner join mytable m2 on m1.id = m2.related
where m1.id = 1
1
Pelin 17 Apr. 2018 im 14:50

Können Sie diesen Code ausprobieren?

SELECT * FROM table WHERE (id = 1 AND related IS NULL) OR related = 1;

Ich erstelle eine Tabelle mit mehr Elementen und sie gibt zurück, was Sie wollen. Überprüfen Sie dies Bildbeschreibung hier eingeben

1
WiLLyxVKei 17 Apr. 2018 im 14:56

Sie können UNION ALL ausprobieren oder UNION verwenden, wenn Sie keine Duplikate möchten

select * from mytable m1 where m1.id = 1
UNION
select * from mytable m2 where m2.related = 1
1
Mangesh Sathe 18 Apr. 2018 im 07:14