2009-04-24 16 views
0

Ich versuche, eine Abfrage zu kodieren, die alle Nachrichten und alle Kommentare für jede Nachricht erhält. Meine aktuelle Abfrage ist:Holen Sie sich alle Nachrichten und alle Kommentare

SELECT n.*, 
     c.* AS comments 
    FROM news n 
     JOIN comments c ON (c.news_id = n.id) 

Aber wenn ich die Abfrage als Array hole es gibt mir einen Schlüssel von Kommentar, und ich möchte einen Schlüssel von Nachrichten haben, und alle Kommentare in einem Sub-Array.

Etwas wie:

Array 
(
    [0] => Array 
    (
     [id] => 1 // news' id 
     ...  // rest of news' data 
     [comments] = Array 
     (
      [id] => 1 // comment's id 
      ...  // rest of comments' data 
     ) 
    ), 
    ... // all other news 
) 

Dank!

Antwort

2

Sie können in einer Abfrage nicht tun - am besten die Abfrage, die Sie haben zu nehmen und nachbearbeiten die resultierende Antwort auf die Datenstruktur Sie benötigen.

Um weiter zu gehen - jede SQL-Abfrage kann nur ein zweidimensionales Array von Daten zurückgeben - eine Dimension für die Spalten und eine für die übereinstimmenden Zeilen. In Ihrem Fall ist das, wonach Sie eigentlich suchen, eher ein dreidimensionaler Tisch.

Beachten Sie auch, dass bei Ihrer Abfrage wie geschrieben alle news Daten immer wieder für jeden Kommentar für jeden Artikel zurückgegeben werden. Dies ist eine ineffiziente Nutzung von Bandbreite und Ressourcen vom Datenbankserver.

Es ist wahrscheinlich effizienter es wie dies zu tun (in Pseudocode):

SELECT * FROM news 
... 
foreach ($rows as $row) { 
    $row['comments] = array(); 
    $news[$row['id']] = $row; 
} 

SELECT * FROM comments 
... 
foreach ($rows as $row) { 
    $news[$row['news_id']]['comments'][] = $row; 
} 

Die erste Abfrage alle der News-Artikel bekommt und legt sie in einem Array.Die zweite Abfrage ruft die Kommentare ab und akkumuliert ein separates Array innerhalb der Struktur jedes Nachrichtenartikels.

2

Ich gehe davon aus, dass es einzelne Datensätze und nicht Datenstrukturen zurückgibt. Sie müssen diese Datensätze selbst in der Datenstruktur gruppieren. Ich würde nach Möglichkeit für einen Beispielcode durchhalten, aber dies kann nicht direkt über SQL getan werden. (da du PHP auch nicht direkt von der DB zurückbekommen hast)

Benutzt du irgendeine Art von ORM? Sie können sich betrachten wollen suchen:

  • Rocks, Open Source ORM für PHP 5.1 plus, freie Software (GNU LGPL)
  • Doctrine, Open Source ORM für PHP 5.2.3, freie Software (GNU LGPL)
  • Propel, ORM und Query-Toolkit für PHP 5, inspiriert von Apache Torque, freier Software (GNU LGPL)
  • EZPDO, Open Source ORM für PHP 5.0.4 oder neue, freie Software (BSD)
  • DABL , Datenbankklassenersteller und Query Builder, von Propel inspiriert, aber einfacher zu installieren, freie Software
  • Data Shuffler Data Mapper-Implementierung (New BSD)
  • Outlet Open Source ORM (Beta) für PHP 5.1.6 oder neuer verwendet einen ähnlichen Ansatz wie Hibernate (New BSD)
  • Coughphp Open-Source-ORM für PHP5, verwendet Code-Generierung (Es sollte möglich sein, andere Datenbanktreiber anzuschließen, aber im Lieferumfang ist nur MySQL-Unterstützung enthalten. 1) (FreeBSD)

http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#PHP

0

Sie können innere Verknüpfung verwenden, um das Ergebnis in einer einzigen Abfrage zu erhalten.

Angenommen, Ihre Datenbankstruktur ist wie:

tab_news: news_id, Nachrichten

tab_cmt: cmt_id, news_id, cmt

jetzt schreiben Abfrage wie:

select n.news, c .cmt von tab_news n innerer Join tab_cmt c on (c.news_id = n.news_id)

Verwandte Themen