2010-11-20 13 views
2

Ich kodiere ein Filmarchivskript unter Verwendung von Codeigniter für mich mit PHP. Ich erhalte Filminformationen von IMDb und füge sie meiner Datenbank hinzu. Ich füge Links für Filme hinzu, die ich mit einer anderen Tabelle namens Links ausgewählt habe.Verknüpfen von Zeilen als Array aus einer anderen Tabelle für jede Zeile

Dies ist die Abfrage, die ich die Filme aus der Datenbank erhalten bin mit:

$movies = $this->db->query("SELECT * 
    FROM movies 
    ORDER BY ".$order['by']." ".$order['type']." 
    LIMIT ".$limit.", " . $this->config->item('moviePerPage') 
); 

und ich es im Hinblick Datei wie folgt bin holen:

foreach ($movies->result() as $row) { 
    echo $row->name; 
} 

Jetzt die Links angezeigt werden müssen jeder Film mit den übereinstimmenden IDs (Filme können mehr als einen Link haben). Meine Linktabelle hat folgende Spalten: 'id', 'movietid', 'name', 'link'

Wie bekomme ich Links für jeden Film mit einer einzigen MySQL-Abfrage? Ist es möglich, alle Links, die sich auf den aktuellen $ row Film beziehen, zu erhalten und sie an eine einzelne Variable als Array zu binden? damit kann ich es mit foreach() loopen und Links für jeden Film anzeigen.

btw: movies.movieid und links.movieid Spalten haben die gleichen Daten.

Antwort

3

Ich glaube, Sie MySQL benötigen GROUP_CONCAT

Tun Sie etwas wie folgt aus: -

SELECT 
    movies.*, 
    group_concat(links.link ', ') as links 
FROM movies 
LEFT JOIN links 
ON links.movieid = movies.movieid 
GROUP BY movies.movieid 

Sie werden für jeden Film eine durch Kommata getrennte Liste von Links. , die Sie mögen diese extrahieren kann: -

foreach ($movies->result() as $row) { 
    $linksArray = explode(",",$row->links); 
} 

Updates Ich denke, dies ist der einzige Weg ist, dass Sie die Ergebnisse erhalten, können mehrere Ergebniszeilen für einen einzelnen Film mit mehreren Links ohne.

Achten Sie nur auf die maximale Länge der Zeichen, die Sie im Ergebnis erhalten können - standardmäßig 1024 Zeichen. Lesen Sie Mysql group_concat_max_length und Group concat max length, um zu erfahren, wie Sie das Limit überschreiben können.

Und wie Dan Grossman herausgefunden hat, wenn Sie glauben, dass die Links Komma enthalten können, verwenden Sie ein anderes oder ungewöhnliches Trennzeichen.

+0

Links können Kommas enthalten. Was Sie tun, gehört nicht in SQL.Das Erstellen von Datenstrukturen und Anzeigelogik gehört in die Anwendung. –

+0

@Dan Grossman - wenn Kommas ein Problem sind, kann ein anderes ungewöhnliches Trennzeichen verwendet werden wie '%% @@ && @@ %%' Wie gehört es nicht zu SQL? group_concat ist eine mysql-Klausel und wird so verwendet. Ich bin nicht hier, um meine Antwort durchzusetzen, aber was ist daran falsch? Benutzer müssen nur auf die Fallstricke achten und das ist alles. –

+0

Ich musste 'SEPARATOR' vor dem '', '' verwenden, um die Abfrage erfolgreich auszuführen. [Siehe doc] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat). –

0

VERBINDEN Sie die beiden Tabellen, so wie es der Name Ihrer Frage impliziert.

SELECT 
    movies.*, 
    links.* 
FROM movies 
LEFT OUTER JOIN links 
ON links.movieid = movies.movieid 
... 

Sie erhalten eine Zeile pro Movie-Link-Paar. Wenn für einen Film keine Links vorhanden sind, erhalten Sie eine Zeile mit den Filminformationen und NULL-Werten in den Spalten, die der Linktabelle entsprechen.

Sie können diese Ergebnisse wiederholen und die Links für jeden Film in ein Array einfügen, das vom Film codiert wird, wenn Sie möchten.

+0

Ich habe es versucht, aber mit einem Problem aufgetreten. Wenn es zu diesem Film 2 Links gibt, erstellt er zwei gleiche Movie-Arrays. könnte das so sein ?: $ movie ['name'], $ movie ['movietid'], $ movie ['links'] [0,1 ...] ['name'] – Valour

+0

@Spelljack, überprüfe meine Antwort . Auf diese Weise erhalten Sie für jeden Film ein einzelnes Ergebnis, auch wenn ein Film mehrere Links enthält. –

+0

Das ist kein Problem. So funktioniert eine relationale Datenbank. Sie müssen den Code schreiben, um ihn in das gewünschte Array umzuwandeln. –

Verwandte Themen