2009-04-24 12 views
0

J'essaye de coder une requête qui obtient toutes les nouvelles et tous les commentaires pour chaque nouvelles. Ma requête en cours est:Récupérer toutes les nouvelles et tous les commentaires

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

Mais quand je chercher la requête dans un tableau, il me donne une clé par commentaire et je voudrais avoir une clé par les nouvelles et tous les commentaires dans un sous-réseau.

Quelque chose comme:

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 
) 

Merci!

Répondre

2

Vous ne pouvez pas le faire dans une requête - préférable de prendre la requête que vous avez et post-traitement, la réponse résultant pour obtenir la structure de données dont vous avez besoin.

Pour aller plus loin - toute requête SQL ne peut renvoyer qu'un tableau de données bidimensionnel - une dimension pour les colonnes et une pour les lignes correspondantes. Dans votre cas, ce que vous êtes en réalité ressemble plus à un tableau en trois dimensions.

Notez également que sur votre requête comme écrit va retourner toutes les données news encore et encore pour chaque commentaire pour chaque article. C'est une utilisation inefficace de la bande passante et de la ressource du serveur de base de données.

Il est probablement plus efficace de le faire comme ça (en pseudo-code):

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; 
} 

La première requête obtient tous les articles de presse et les met dans un tableau.La seconde requête reçoit les commentaires et accumule un tableau distinct dans la structure de chaque article de news.

2

Je suppose qu'il renvoie des enregistrements individuels et non des structures de données. Vous allez devoir regrouper vous-même ces enregistrements dans la structure de données. Je voudrais tenir un exemple de code si possible, mais cela ne peut pas être fait directement via SQL. (puisque vous n'avez pas récupéré PHP directement à partir de la base de données)

Utilisez-vous une sorte de ORM? Vous voudrez peut-être envisager de regarder:

  • Rocks, Open Source ORM pour PHP 5.1 plus, un logiciel libre (GNU LGPL)
  • Doctrine, ORM Open Source pour PHP 5.2.3, logiciel libre (GNU LGPL)
  • Propel, ORM et Query-Toolkit pour PHP 5, inspiré par Apache couple, logiciel libre (GNU LGPL)
  • EZPDO, Open Source ORM pour PHP 5.0.4 ou plus récent, le logiciel libre (BSD)
  • DABL , Créateur de classe de base de données et Générateur de requête, inspiré par Propel, mais plus facile à installer, le logiciel libre
  • Data Shuffler données de mise en œuvre de cartographe (New BSD)
  • Outlet ORM open source (bêta) pour PHP 5.1.6 ou plus récent, utilise une approche similaire à Hibernate (Nouveau BSD)
  • Coughphp Open source ORM pour PHP5, utilise la génération de code (Il devrait être possible de connecter d'autres pilotes de base de données, mais seul le support de MySQL est inclus. 1) (FreeBSD)

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

0

Vous pouvez utiliser la jointure interne pour obtenir une requête unique.

Supposons que la structure de votre base de données est comme:

tab_news: news_id, nouvelles

tab_cmt: cmt_id, news_id, cmt

écrire maintenant requête comme:

sélectionner n.news, c .cmt de tab_news n jointure interne tab_cmt c on (c.news_id = n.news_id)

Questions connexes