2010-07-17 2 views
0

J'ai deux tables, products et product_tags.mysql sélection de données

table de produits;

product_id int 
name varchar 
description text 
price decimal(12,2) 
status enum 
sale int 
hit int 
date_add datatime 
date_update datetime 

table product_tags;

tag_id int 
product_id int 
tag varchar 

où la table product_tags a un à plusieurs relations avec products, par exemple:

tag_id | product_id | tag 
1  1    tag1 
2  1    tag2 
3  1    tag3 

Je veux extraire des données à partir d'une seule requête. (étiquettes de produit et de produit).

Répondre

2

Utilisez quelque chose comme ceci:

SELECT * 
    FROM products p 
INNER JOIN product_tags pt 
    ON (p.product_id = pt.product_id) 

Si vous voulez récupérer tous les produits indépendamment du fait qu'ils ont une étiquette ou non, utilisez un OUTER JOIN.

SELECT * 
    FROM products p 
    LEFT OUTER JOIN product_tags pt 
    ON (p.product_id = pt.product_id) 

Si vous essayez de combiner toutes les balises pour chaque produit en une seule liste séparée par des virgules alors quelque chose comme cela pourrait fonctionner dans une base MySQL:

SELECT p.product_id, GROUP_CONCAT(pt.tag SEPARATOR ',') 
    FROM products p 
    LEFT OUTER JOIN product_tags pt 
    ON (p.product_id = pt.product_id) 
GROUP BY p.product_id; 

Pour plus de documentation sur GROUP_CONCAT, voir le MySQL Reference Manual

+0

tom merci pour votre réponse. Mais j'ai essayé ça. cette requête rétrograde plus de lignes. si le produit a des étiquettes. cette requête renvoie trois lignes. – alioygur

+0

Oui, si vous sélectionnez des données pour les produits ET les étiquettes, vous obtiendrez une ligne pour chaque combinaison de produit et d'étiquette. Si un produit a 3 étiquettes alors il y aura trois rangées pour ce produit, une pour chaque étiquette. Que voulez-vous exactement? Voulez-vous une ligne pour chaque produit avec une seule colonne contenant une concaténation de toutes ses balises? Cela semble un peu étrange. – Tom

+0

oui je ne veux que des résultats avec des tags. Je pense que ce n'est pas possible. J'ai besoin de faire deux requêtes distinctes pour cela. comme ceci; $ Query_product_data = mysql_query ("SELECT * FROM produits où product_id = '1'") $ query_product_data = mysql_query $ Query_product_tags_data = mysql_query ("SELECT * FROM product_tags WHERE id_produit = '1'") c'est le meilleur moyen? – alioygur

Questions connexes