Wie muss ich die SQL-Suche gestalten?

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Tabula_Rasa

Mitglied
12 Mai 2017
277
2
18
Hallo zusammen,

ich habe eine Tabelle comments mit folgenden Spalten:

id int PRIMARY KEY NOT NULL AUTO_INCREMENT
commentator_id varchar(250)
commented_id varchar(250)
p_id varchar(250)
comment varchar(250)

Die commentator_id und commented_id sind IDs, die in der Tabelle users enthalten sind.

Folgende query funktioniert:

Javascript:
router.get('/comments' ,(req,res,next)=>{
  let p_id = req.query.p_id;
  db.query(`select comments.commentator_id, comments.comment, users.username, comments.commented_id from comments LEFT JOIN users ON comments.commentator_id=users.id where comments.p_id=${db.escape(p_id)}` ,
  (error, results) => {
    if(error) console.log(error);else {
      console.log(results);
    }
  })
})



Das Problem ist, dass ich nochmal einen Join anwenden muss, damit ich Daten bezüglich der kommentierten Person bekomme. Wie joine ich jetzt die comments.commented_id korrekt? Habe es mit einem erneuten Join probiert aber bekomme die Fehlermeldung:

Not unique table/alias: 'users'

Also, wie joine ich jetzt die kommentierte Person, sodass das Resultat der Suche auch die kommentierte Person enthält?
 

m.scatello

Senior HTML'ler
15 Februar 2017
1.664
196
63
Ich lese da 3x *_id als varchar(250), das sieht für mich kaputt aus, oder die Spaltennamen sind äußert unglücklich gewählt.
 

Tabula_Rasa

Mitglied
12 Mai 2017
277
2
18
Ich lese da 3x *_id als varchar(250), das sieht für mich kaputt aus, oder die Spaltennamen sind äußert unglücklich gewählt.

Ich kenne mich nicht ganz mit den Konventionen dieser Sprache aus, deshalb weiß ich nicht, wie man Spaltennamen wählt. Dachte, es seien gute Spaltennamen, weil man direkt weiß, was gemeint ist. Hätte p_id post_id bennenen sollen, dann glaube ich wäre es klarer.
 

m.scatello

Senior HTML'ler
15 Februar 2017
1.664
196
63
Das Problem ist eher der Datentyp. Bei einer ID geht man von einem Integer aus, also ein Zahl. Du hast aber varchar, also Text.
 
  • Like
Reaktionen: Tabula_Rasa

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.516
479
83
68
Geht wahrscheinlich auch mit joins aber ich würde es übersichtlicher und besser lesbar finden, wenn man zwei Subqueries verwendet.
Edit: Mir scheint, ich muss mich korrigieren: Habe jetzt ein wenig mit Subqueries getestet und festgestellt, dass eine Subquery in diesem Zusammenhang nur einen Wert zurück geben darf. D. h. will man mehrere Werte aus der Tabelle users auslesen kommt man auf diese Weise nicht zum Ziel.
Trifft das so weit zu?
 
Zuletzt bearbeitet:

Tabula_Rasa

Mitglied
12 Mai 2017
277
2
18
Geht wahrscheinlich auch mit joins aber ich würde es übersichtlicher und besser lesbar finden, wenn man zwei Subqueries verwendet.
Edit: Mir scheint, ich muss mich korrigieren: Habe jetzt ein wenig mit Subqueries getestet und festgestellt, dass eine Subquery in diesem Zusammenhang nur einen Wert zurück geben darf. D. h. will man mehrere Werte aus der Tabelle users auslesen kommt man auf diese Weise nicht zum Ziel.
Trifft das so weit zu?

Hey, ich denke, das trifft soweit zu. Ich habe da eine andere Methode gewählt. Ich hole mir erstmal nur die Hauptkommentare, also die Kommentare, bei denen der commented_id gleich null ist und später lade ich dann zu jedem Hauptkommentar die Nebenkommentare. Dafür muss ich die id des Eintrags auf den sich die Nebenkommentare beziehen, in der Spalte row_id speichern. Bislang funktioniert es, falls es Probleme geben sollte, werde ich nochmal fragen und es würde mich freuen, wenn du dann weiterhin dein Wissen mit mir teilen würdest :).