MyBB.de Forum

Normale Version: [MySQL] Abfrage über 2 Tabellen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hi alle zusammen,

langsam dringe ich mit meiner Seite in Gebiete vor, wo mein Wissen allmählich seine Grenzen findet: MySQL-Abfragen ^^

Folgende Situation:
Ich habe für meine News Section 2 Tabellen: "news" für die News-Einträge an sich, und "news_comments", in der die Kommentare der User zu den News abgespeichert werden.
Ein News-Eintrag hat eine eindeutige nid, die auch bei den Kommentaren mit gespeichert wird. (Irgendwie logisch... Sonst macht das ganze wenig sinn xD)

Mein Problem:
Da ich mich nicht sonderlich gut mit MySQL und Datenbanken auskenne, weiß ich nicht, wie ich folgende Abfrage formulieren muss:
Ich möchte beispielsweise die 5 neuesten Einträge aus "news" auslesen (soweit so gut ^^). Dazu möchte ich aber noch zu jeder der 5 News die Anzahl der zu ihr gehörenden Kommentare mit auslesen.
Könnt ihr mir sagen, wie diese Abfrage aussehen muss?

(Mir geht es wirklich nur um die Abfrage: Das Verarbeiten des Ergebnisses und die Ausgabe sind kein Problem Wink)

Könnt ihr mir vielleicht auch ein gutes Tutorial zu MySQL empfehlen?
(Bisher habe ich bei Abfragen, die komplexer sind als "SELECT * FROM dings WHERE dongs", irgendwie noch nicht richtig durchschaut ^___^)

Vielen Dank,
Zwoetzen
Hallo Zwoetzen,

ich denke, das solltest du mit > "LEFT JOIN" realisieren können, wie z. B. in dieser Query (aus "index.php")
PHP-Code:
    // Get the online users.
    
...
    
$query $db->query("
        SELECT s.sid, s.ip, s.uid, s.time, s.location, u.username, u.invisible, u.usergroup, u.displaygroup
        FROM "
.TABLE_PREFIX."sessions s
        LEFT JOIN "
.TABLE_PREFIX."users u ON (s.uid=u.uid)
        WHERE s.time>'
$timesearch'
        ORDER BY u.username ASC, s.time DESC
    "
);
    ... 
Ich hoffe, dies hilft dir weiter.
Vielen Dank: Left Join war schonmal ein guter Hinweis, habe es soweit erstmal hinbekommen.

Habe nun zwar die Anzahl der Comments, allerdings hätte ich auch gerne den Autor des neuesten kommentars dazu:

Momentan habe ich:
PHP-Code:
$query $db->query("
    SELECT n.nid, n.subject, n.uid, n.username, n.dateline, n.visible, 
    c.uid as cuid, c.username as cusername, c.dateline as cdateline, 
    COUNT(*) as count 
    FROM news n LEFT JOIN news_comments c ON n.nid=c.nid
    
{$where} GROUP BY n.nid ORDER BY n.dateline DESC LIMIT 0,3"
); 
(Ist nun doch etwas mehr geworden als das anfangs geplante Count ^^)

Das Problem: Von dem entsprechenden Comment-Eintrag bekomme ich immer den ältesten Comment, aber ich hätte gerne die ID und Namen des neuesten Kommentars.

Ist das mit einer Abfrage noch mögich? Also dass ich zu jedem der 3 neuesten News-Einträge direkt noch die 3 Spalten des neuesten dazugehörigen Kommentars bekomme?

(Ich vermute, dass ich da irgendwas beim ORDER BY ändern muss, aber wie gesagt: Ich kenne mich nicht ganz so gut mit MySQL aus... ^^)
Hallo Zwoetzen,

ohne Garantie; aber wenn ich es richtig interpretiere, sortierst du (nur) die 'News' absteigend:
PHP-Code:
... ORDER BY n.dateline DESC LIMIT 0,
Versuche es doch einmal in Kombination mit den 'Comments' absteigend:
PHP-Code:
... ORDER BY n.dateline DESCc.dateline DESC LIMIT 0,

Beispiel: eine Sortierung nach
PHP-Code:
... ORDER BY t.lastpost DESCt.views DESC 
ergibt diese Liste [attachment=3254]
Hmm nein, das bringt irgendwie nichts. Ich erhalte mit dem zusätzlichen Order-Kriterium exakt die gleichen Ergebnisse: Jeweils den ältesten Kommentar zu den News.

Habe aber nun eine andere Lösung finden können, wobei ich nicht weiß, ob es nicht doch besser geht:
PHP-Code:
$query $db->query("
    SELECT *, COUNT(*) as count FROM (
        SELECT n.nid, n.subject, n.uid, n.dateline, n.visible, 
            c.uid as cuid, c.dateline as cdateline
        FROM news n LEFT JOIN news_comments c ON n.nid=c.nid
        
{$where}
        ORDER BY c.dateline DESC
    ) t 
    GROUP BY t.nid 
    ORDER BY t.dateline DESC
    LIMIT 0,3"
); 
Zuerst "verbinde" ich also die beiden tabellen und sortiere nach den kommentaren, und as Ergebnis gruppiere ich nach der nid und sortiere es dann nach dem Alter der News. Das bringt zumindest das gewünschte Ergebnis ^__^

Trotzdem Danke für deine Antwort Wink

Insofern, vorerst » Erledigt