2016-06-05 26 views
0

Ich habe eine Tabelle wie folgt aus:Wie erhält man den Wert verwandter Zeilen?

// QandA 
+----+----------+----------------+------+---------+-----------+ 
| id | subject | acceptedanswer | type | related | id_author | 
+----+----------+----------------+------+---------+-----------+ 
| 1 | subject1 | NULL   | 0 | NULL | 123  | 
| 2 |   | 1    | 1 | 1  | 452  | 
| 3 | subject2 | NULL   | 0 | NULL | 635  | 
| 4 |   | 1    | 1 | 3  | 432  | 
| 5 |   | NULL   | 1 | 1  | 246  | 
+----+----------+----------------+------+---------+-----------+ 

/* columns explanations: 
- acceptedanswer can be NULL, 0, 1. (0 and NULL are identical). (it is NULL for questions) 
- type is 0 for questions and 1 for answers. 
- related is NULL for questions. For answers is containing the number of its own question 
*/ 

Nun, ich habe zwei Parameter:

  • id Nummer einer Antwort: $id = 5
  • id_author dieser Antwort $id_author = 246

Jetzt Ich versuche, diese zwei Dinge zu bekommen:

  • Gegenstand seiner verdanken Frage
  • Spezifizierungs jede akzeptierte-Antwort oder keine eigene Frage hat.

Hier ist meine query:

SELECT t2.subject 
FROM qanda t1 
JOIN qanda t2 ON t1.related = t2.id AND t2.type = 0 
WHERE t1.id = $id AND t2.id_author = $id_author 

Aktuelles Ergebnis:

+----------+ 
| subject1 | 
+----------+ 

Erwartetes Ergebnis:

+----------+---+ 
| subject1 | 1 | 
+----------+---+ 
--   ^this 1 means the question of this answer has a accepted answer 
--   ^this should be 0 if there isn't any accepted answer for that question 

Wie kann ich das tun?

Antwort

1

Wenn Sie wissen wollen, ob die Frage mit der Antwort id = 5 eine akzeptierte Antwort hat und angenommen (wie in den Kommentaren erwähnt), dass jede Frage nur eine akzeptierte Antwort haben kann, dann sollte so etwas (Hinweis: zwei Joins) Arbeit ...

SELECT x.subject 
    , y.id IS NOT NULL has_accepted 
    FROM qanda x 
    LEFT 
    JOIN qanda y 
    ON y.related = x.id 
    AND y.type = 1 
    AND y.acceptedanswer = 1 
    JOIN qanda z 
    ON z.related = x.id 
WHERE x.type = 0 
    AND z.id = 5; 
+0

Das ist falsch ..! Wie ich in der Frage erwähnt habe, habe ich eine ID einer Antwort ... Sie haben '$ id' in Ihrer Anfrage überhaupt nicht verwendet. – stack

+0

Eigentlich habe ich es herausgefunden .. Ich muss hinzufügen, dass where-Klausel: '. . . wo x.type = 0 und x.id = $ id' – stack

+0

Sie wissen, Ihre Abfrage funktioniert auch, nur es ist seltsam für mich .. warum Ihre Abfrage funktioniert? Ich bin mir ziemlich sicher, dass ich zwei 'Joins' in diesem Fall brauche. aber deine arbeitet mit einem "Join". Kannst du bitte bitte einige Erklärungen zu deiner Antwort hinzufügen? Speziell erklären, was ist das "DISTINCT" und diese Note, die Ende Ihrer Antwort ist .. – stack

1

Versuchen Sie folgendes:

SELECT t2.subject, max(COALESCE(t3.accepted, 0)) 
FROM qanda t1 
INNER JOIN qanda t2 ON t1.related = t2.id AND t2.type = 0 
INNER JOIN qanda t3 ON t1.related = t3.related 
WHERE t1.id = $id AND t2.id_author = $id_author 
GROUP BY t3.related 

obwohl, ich bin nicht sicher, ob ich Ihre Absichten zu verstehen. COALESCE, um Nullen loszuwerden, und max(), um zu sehen, ob eine der Antworten akzeptiert wurde. Ich gehe davon aus, dass nur Antworten nicht Null-Werte in related Spalte haben.

Außerdem wäre es vielleicht eine bessere Idee, nicht verschiedene Dinge in der gleichen Tabelle zu halten?

+0

Scheint korrekt .. danke +1 – stack

+0

Nur können Sie bitte sagen Sie mir, warum haben Sie 'GROUP BY' verwendet? – stack

+0

Ich habe angenommen, dass Sie viele Antworten pro Frage haben, und Sie möchten wissen, ob es bereits eine akzeptierte Antwort für die Frage der Antwort mit '$ id' gibt. Sie haben also eine Eins-zu-Viele-Beziehung (zwischen der Antwort, an der Sie interessiert sind und allen Antworten, die Sie überprüfen müssen), also müssen Sie gruppieren. – michaJlS

Verwandte Themen