2016-06-23 16 views
0

Ich versuche, "Eltern" -Noten zurückzugeben, wobei die from_person_id = 2. Ich möchte auch alle untergeordneten Zeilen der "Eltern" -Note zurückgeben.MySQL Weitere Zeilen in derselben Tabelle auswählen

  • A "Eltern" Notiz hat eine parent_note_id von 0.
  • Ein "Kind" Anmerkung parent_note_id gleich ihrer "Eltern" Note des thread_note_id hat.
  • Beide "Eltern" und "Kind" Notizen haben die gleiche thread_note_id.

Unten ist ein Beispiel für 4 Zeilen aus der Anmerkungstabelle. Meine Abfrage sollte alle 4 dieser Notizen zurückgeben. Stattdessen gibt es nur einen zurück.

mysql> SELECT * FROM notes WHERE note_id <= 4; 
+---------+----------------+----------------+----------------+ 
| note_id | parent_note_id | thread_note_id | from_person_id | 
+---------+----------------+----------------+----------------+ 
|  1 |    0 |    1 |    2 | 
|  2 |    1 |    1 |    5 | 
|  3 |    1 |    1 |    5 | 
|  4 |    1 |    1 |    5 | 
+---------+----------------+----------------+----------------+ 
4 rows in set (0.00 sec) 

mysql> SELECT DISTINCT n.* 
    -> FROM notes as n 
    -> JOIN notes as n2 on n2.thread_note_id = n.thread_note_id 
    -> WHERE n.from_person_id = 2 
    -> AND n.parent_note_id = 0; 
+---------+----------------+----------------+----------------+ 
| note_id | parent_note_id | thread_note_id | from_person_id | 
+---------+----------------+----------------+----------------+ 
|  1 |    0 |    1 |    2 | 
+---------+----------------+----------------+----------------+ 
1 row in set (0.00 sec) 

dachte ich, einen Weg aus es mit zwei Sub-Abfragen zu tun, aber ich versuche, mit Unterabfragen in MySQL zu vermeiden.

Jeder hat eine Empfehlung, wie die Abfrage abgerufen werden soll, um die übergeordnete Notiz und alle seine untergeordneten Elemente, die JOIN anstelle von Unterabfragen verwenden, zurückzugeben?

+0

Warum können Sie nicht einfach alle Zeilen mit der gleichen 'thread_note_id' zurückgeben? Es scheint mir, dass dies zu Ihrem gewünschten Ergebnis passen sollte. –

+0

Ich möchte nur die Notizen, wo die "Eltern" -Note eine from_person_id von 2 hat. Ich bin nicht in der Lage, eine Möglichkeit, die Kinder zu bekommen, da sie unterschiedliche from_person_id haben. – Daryl

Antwort

0

Ich glaube, Sie würden dies tun, wie:

select n.* 
from notes n 
where n.parent_note_id = (select n2.note_id 
          from notes n2 
          where n2.from_person_id = 2 
         ) or 
     n.from_person_id = 2; 

Für die beste Leistung, die Sie auf notes(from_person_id, note_id) einen Index möchten.

+0

Hallo Gordon, das ist ähnlich wie das, was ich gefunden habe. Aber es verwendet eine Unterabfrage, die ich versuche zu vermeiden. – Daryl

+0

@ Daryl. . . Es gibt keinen Grund, eine Unterabfrage zu vermeiden. –

+0

@GordonLinoff ... Ich wurde angewiesen, keine Unterabfragen an großen Tabellen an meinem Arbeitsplatz zu verwenden. Der Grund, warum ich angegeben wurde: Unterabfragen in MySQL machen einen vollständigen Tabellenscan und in einer großen Tabelle, die die Abfrage sehr lange dauern kann. Ist das falsch? – Daryl

Verwandte Themen