Seite 1 von 1

[MySQL] 3 vrkn.Tabellen: eine zeile mit mehreren unterzeilen

Verfasst: 16.02.2008 01:27
von mellow
Hmm also im Forum schreib ich grad an einem neuen Feature. Mit dem Befehl:

Code: Alles auswählen

$sql = 'SELECT chart_id, chart_hot, chart_not, chart_song_name, chart_artist, chart_album, chart_audio, chart_pic, chart_link, chart_datum, chart_last_pos, chart_best_pos, username FROM '. phpbb_charts .', '. USERS_TABLE .' WHERE chart_poster_id=user_id ORDER BY (chart_hot-chart_not) DESC, chart_artist LIMIT 0,'.$v_num;
wird aus 2 tabellen eine abfrage erstellt, die dann ungefähr so aussieht:

Code: Alles auswählen

1. TRACK - COVER - ... - gepostet von USERNAME A - BEWERTUNG 5
2. TRACK - COVER - ... - gepostet von USERNAME B - BEWERTUNG 4
3. TRACK - COVER - ... - gepostet von USERNAME A - BEWERTUNG 3
.
.
.

ich hab jetzt noch eine dritte Tabelle in der ich die einzelnen Tracks bewerte. die bewertungen sollen über eine dropdownbox unter dem jeweiligen track stehen. eingabe und dropdownbox funktioniert. nur die Ausgabe nicht!

statt

Code: Alles auswählen

1. TRACK - COVER - ... - gepostet von USERNAME A - BEWERTUNG 5
 ------ kommentar 1
 ------ kommentar 2
2. TRACK - COVER - ... - gepostet von USERNAME B - BEWERTUNG 4
 ------ kommentar 3
3. TRACK - COVER - ... - gepostet von USERNAME A - BEWERTUNG 3
 ------ kommentar 4
 ------ kommentar 5
 ------ kommentar 6
.
.
.

kommt nur grütze raus.


wie muss ich die sql-abfrage gestalten, dass das rauskommt, was ich will.

sofern ich die dritte tabelle mit einer zweiten abfrage mit einbinde:

Code: Alles auswählen

$sql = 'SELECT * FROM '. phpbb_charts .', '. phpbb_charts_comments .' WHERE chart_id=comm_chart_id ORDER BY datum DESC';

zeigt er mir nur den ersten track ohne daten (also nur 1 - ) - da geht dann garnix mehr.

Verfasst: 17.02.2008 00:45
von mellow
Knapp 24h später mein Aufruf nach einem Ansatzpunkt! Ich sterbe hier und sitze schon seit 64h an dem Problem!

Verfasst: 17.02.2008 14:46
von S2B
Teste das ganze mal mit LEFT JOIN:

Code: Alles auswählen

$sql = 'SELECT *
   FROM tracks t, users u
   LEFT JOIN comments c
      ON c.track_id = t.track_id
   WHERE ...
das ganze musst du dann in deiner While-Schleife nach der Track-ID gruppieren, z.B. so:

Code: Alles auswählen

$tracks = $comments = array();
while ($row = $db->sql_fetchrow($result))
{
   if (!isset($tracks[$row['track_id']]))
   {
      $tracks[$row['track_id']] = $row;
   }

   if (!isset($comments[$row['track_id']]))
   {
      $comments[$row['track_id']] = array($row);
   }
   else
   {
      $comments[$row['track_id']][] = $row;
   }
}

Verfasst: 20.02.2008 01:37
von mellow
Würde es dir etwas ausmachen, wenn ich dir die ganze charts.php schicke und du mal kurz drüber schaust? Weil so ganz blick ich da noch nicht durch.

Verfasst: 20.02.2008 16:34
von S2B
Verlink sie an besten hier (KB:datei), dann können sich das auch andere anschauen, da ich im Moment nicht sonderlich viel Zeit habe.

Verfasst: 28.02.2008 19:01
von mellow
also die sql sieht ganz ordentlich aus. ohne die gruppierung zeigt er mir nun die track-zeilen so oft an, wie es comments für den track gibt ... mit den anderen. war vorher nicht der fall.

die gruppierung aber bereitet mir kopfschmerzen.
mit isset prüfe ich ob eine variable existiert. aber was bewirkt array($row)und $row? In die if-Schleifen müsste ich ja den ganzen momentanen Ausdruck reinschreiben. wie mach ich die Ausgabe der Comments? genauso wie die charts? da ist das im moment so geregelt:

Code: Alles auswählen

$template->assign_block_vars('chart_block', array(
...
); 
also dann

Code: Alles auswählen

$template->assign_block_vars('comment_block', array(
...
); 
und in der template die steuerung über

Code: Alles auswählen

<!-- BEGIN comment_block -->

...

<!-- END comment_block -->
in der dropdownbox?

Verfasst: 28.02.2008 20:26
von S2B

Code: Alles auswählen

foreach ($tracks as $track_id => $track)
{
   // Ausgabe des Tracks ($track)

   // Gibt es Kommentare?
   if (isset($comments[$track_id]))
   {
      foreach ($comments[$track_id] as $comment)
      {
         // Ausgabe des Kommentars ($comment)
      }
   }
}