2012-04-12 19 views
0

Je me demandais comment je pouvais faire cela sans utiliser group_concat. Comme mes commentaires sont si longs, le groupe_concat est sur leur maximum, donc il ne retourne pas tous les commentaires. La seule autre façon dont je pourrais penser à le faire serait de boucler la requête. Juste pour que vous sachiez qu'il y a plusieurs produits et plusieurs avis pour chaque produit. Des idées?Interroger plusieurs lignes à partir de 3 tables différentes

sortie comme quelque chose comme ceci:

[0] => stdClass Object (
     [name] => Product 
     [reviews] => Array(
       [0]=> (
         [user] => "cKendrick " 
         [overall] => "1" 
         [Rating] => "lalalalalala review" 
        ) 
       [1] = > 
        (... 
    ) 

) 
[1] => stdClass Object (.. 

MISE À JOUR:

"SELECT product.id, 
    product.name as name, 
    category.permName as category, 
    subCategory.permName as subCategory, 
    product.permName as permName, 
    product.picture as picture, 
    user.username as username, 
    user.firstName as firstName, 
    user.lastName as lastName, 
    user.picture as userPicture, 
    rating.description as review 
FROM (
    SELECT * 
    FROM product 
    LIMIT ?, 30 
) product 
LEFT JOIN category 
    ON category.id = product.category 
LEFT JOIN subCategory 
    ON subCategory.id = product.subCategory 
LEFT JOIN rating 
    ON rating.idAlcohol = product.id 
LEFT JOIN user 
    ON user.id = rating.idUser 
ORDER BY product.lastReview desc" 

Comment pourrais-je limiter par sa catégorie?

+1

J'essaie d'obtenir des informations à partir de 3 tables. La table des produits, la table d'évaluation et la table des utilisateurs. La table des produits montre plusieurs produits différents tandis que les avis montrent plusieurs avis différents par produit et le tableau des utilisateurs montre l'utilisateur qui a fait l'examen. J'utilise group_concat parce que je ne sais pas quoi d'autre à utiliser. Donc je suppose que ma question est de savoir comment je pourrais le faire sans utiliser group_concat. – cKendrick

Répondre

0

Quel DBAL utilisez-vous? vous pourriez en PHP classique faire comme ça si vous voulez vraiment utiliser une seule requête -

<?php 

$db = new PDO('dsn', 'user', 'pass'); 
$sql = "SELECT product.id, product.name, rating.overall, rating.description, user.name AS user 
     FROM (
      SELECT * 
      FROM product 
      LIMIT 30 
     ) product 
     LEFT JOIN rating 
      ON product.id = rating.productId 
     LEFT JOIN user 
      ON user.id = rating.userId"; 

$stmt = $db->prepare($sql); 
$stmt->execute(); 

$output = array(); 
while ($row = $stmt->fetchObject()) { 
    $output[$row->id]['name'] = $row->name; 
    $output[$row->id]['reviews'][] = array('user'  => $row->user, 
              'overall'  => $row->overall, 
              'description' => $row->description); 
} 

MISE À JOUR - Je suis déplacé la table produit dans une sous-requête pour permettre de limiter le nombre de produits. Notez que tout filtrage sur les produits doit être ajouté à la sous-requête et non à la sélection externe.

MISE À JOUR - requête mise à jour basée sur la mise à jour à la question. Comme vous voulez filtrer les produits en fonction de la catégorie avant de limiter le résultat, les jointures et les critères doivent être ajoutés à la sous-requête -

SELECT product.id, 
    product.name as name, 
    product.category, 
    product.subCategory, 
    product.permName as permName, 
    product.picture as picture, 
    user.username as username, 
    user.firstName as firstName, 
    user.lastName as lastName, 
    user.picture as userPicture, 
    rating.description as review 
FROM (
    SELECT 
     p.*, 
     category.permName AS category, 
     subCategory.permName AS subCategory 
    FROM product 
    LEFT JOIN category 
     ON category.id = product.category 
    LEFT JOIN subCategory 
     ON subCategory.id = product.subCategory 
    WHERE category.permName = ? 
    LIMIT ?, 30 
) product 
LEFT JOIN rating 
    ON rating.idAlcohol = product.id 
LEFT JOIN user 
    ON user.id = rating.idUser 
ORDER BY product.lastReview desc 
+0

Qu'est-ce que DBAL? Je suis désolé je suis nouveau à ceci et essaye d'apprendre. J'ai essayé votre code et il est revenu avec un tableau vide. Aussi, vous donnez l'impression que je devrais peut-être faire plus de 1 requête? Serait-ce plus intelligent à faire? J'essaie juste de trouver la meilleure façon d'obtenir tout ce contenu à 1 page. – cKendrick

+0

Couche d'abstraction DataBase. Pas besoin de s'excuser, nous devons tous commencer quelque part. Il n'y a rien de mal à le faire dans une requête. Cela signifie simplement que les champs product.id et product.name sont répliqués pour chaque révision sur le même produit. Probablement pas un gros problème dans ce cas. Avez-vous essayé de vérifier la requête dans WorkBench ou quel que soit votre outil de bricolage préféré? – nnichols

+0

Le DBAL serait-il alors actif? J'utilise phpmyadmin pour travailler avec le db. En ce qui concerne la requête, cela fonctionne bien, mais quand je le fais, il ne montre que 1 note.overall et 1 description de notation et 1 utilisateur. quand il devrait montrer n'importe où de 1 à 10 selon le produit. – cKendrick

0

Voici mes hypothèses:

Vous voulez obtenir tous les produits utilisant des associés. Vous voulez savoir qui a écrit quelle revue.

select product.id, product.name, rating.overall, rating.description, user.name 
from product 
left join rating on product.id = rating.productId 
left join on user.id=rating.userId; 

Si ce n'est pas ce que vous voulez, éditez votre article et affichez quelques lignes de ce que vous cherchez.

+0

J'ai éditer le post. Sortie Je voudrais être quelque chose comme mon édition, mais s'il y a une autre façon de le faire dans une requête, je suis ouvert à cela. Les jointures ne fonctionneront pas car il y a plusieurs entrées pour rating.overall, rating.description, user.name – cKendrick

Questions connexes