2012-01-17 5 views
0

Disons que nous avons des tables arborescentes.Sélection de lignes à partir de plusieurs tables. Comment?

Products     Fields    Fields Value 
----------------   -------------   -------------- 
    pid catid    fid catid   fid pid value 
-------|-------|   -----|-------   ------|-----|-------- 
    1  1    1  1    1  1  25% 
    2  1    2  1    1  2  32.5% 
          3  2    2  1  45% 
                2  2  42% 
                3  1  17.3% 
                3  2  21% 

La façon normale consiste à sélectionner dans une Products une requête et une boucle à travers le jeu de résultats (RS1).
Ensuite, nous sélectionnons Fields pour catid pour chaque ligne (RS2). Ensuite, effectuez la même action avec RS2 pour sélectionner `Valeur des champs '.

Seul le problème est le problème de performance qui sera réduit en raison de l'exécution de beaucoup de requêtes `quand il y a beaucoup de lignes dans chaque table.

Souhaitez-vous suggérer une meilleure solution pour exécuter moins de requêtes?

modifier
Je veux montrer chaque produit dans une boîte et afficher les champs pour chaque produit avec sa juste valeur. joindre des tables arborescentes ensemble retournera des valeurs dupliquées pour chaque FieldValue dans Products et non utilisable en boucle.

+3

utilisation d'un requête unique avec jointure (s)? –

+1

Vous voulez un 'JOIN': http://dev.mysql.com/doc/refman/5.0/en/join.html – Polynomial

+0

moins de requêtes mais plus compliqué :) –

Répondre

0

utilisation Inscrivez-vous Syntaxe:

SELECT * FROM Products as P 
LEFT JOIN FieldsValue as FV ON FV.PID = P.PID 
LEFT JOIN Fields as F on F.fid = FV.fid 
+2

Pourquoi LEFT OUTER JOIN? Pourquoi pas INNER JOIN? –

+0

@JonathanLeffler: Pourquoi ne pas adhérer à NATURAL? Pourquoi pas produit avec restriction? Pourquoi tant de choix ?! – onedaywhen

+1

L'important est qu'il manque la condition de jointure sur 'catid' –

2

Deviner ce que vous avez besoin, essayez ceci:

SELECT f.catid, fv.* FROM Fields f 
INNER JOIN Products p 
    ON f.catid = p.catid 
INNER JOIN FieldsValue fv 
    ON fv.fid = f.fid AND fv.pid = p.pid 
0

Vous pouvez joindre les tables ensemble à l'aide left join:

select * 
from Products p 
left join Fields f on f.catid = p.catid 
left join `fields value` fv on fv.fid = f.fid on fv.pid = p.pid 
where p.pid = 1 
+1

Vous avez également besoin de' fv.pid = p.pid' –

1
SELECT * 
    FROM Products 
     NATURAL JOIN Fields 
     NATURAL JOIN FieldsValue; 
Questions connexes