2010-03-17 8 views
2

Je fais une requête pour retourner tous les paniers d'utilisateurs, stockés dans la table sb_carts. Les informations sur le produit stockées dans sb_carts sont référencées sur deux clés product_sku et school_id. Il doit faire référence à la fois pour retourner un produit unique avec des niveaux de stocks uniques, etc.MYSQL Inner Joindre deux tables sur deux clés

Lorsque j'exécute la requête suivante retourne une ligne, j'attends 3 lignes. J'ai essayé de rompre la jointure interne en deux jointures séparées, mais cela ne retourne qu'un résultat. joindre seulement sur une clé a le résultat désiré, mais peut être renvoyer le mauvais produit. A gauche JOIN renvoie 3 lignes, mais certaines données manquent produit spécifique

Voici un exemple simplifié de ce que je fais

 
SELECT sb_carts.product_sku 
FROM sb_carts 
INNER JOIN sb_products ON sb_products.sku = sb_carts.product_sku 
AND sb_products.school_id = sb_carts.school_id 
WHERE sb_carts.order_id = 0 
AND sb_carts.user_id = 2 
GROUP BY sb_carts.cart_id 

La question complète ressemble

 
SELECT COUNT(DISTINCT sb_carts.cart_id) as quantity, 
sb_carts.* FROM sb_carts 
INNER JOIN sb_children ON sb_children.child_id = sb_carts.child_id 
INNER JOIN sb_school_entities ON sb_school_entities.school_id = sb_children.school_id 
INNER JOIN sb_products ON sb_products.sku = sb_carts.product_sku 
AND sb_products.school_id = sb_carts.school_id LEFT JOIN sb_houses ON sb_children.house_id = sb_houses.id 
LEFT JOIN sb_refund_cart ON sb_carts.cart_id = sb_refund_cart.cart_id 
WHERE sb_carts.order_id = 0 
AND sb_carts.user_id = 2 
GROUP BY sb_carts.child_id, sb_carts.product_sku, sb_carts.school_id 
ORDER BY sb_children.dob_year, sb_children.dob_month, sb_children.dob_day ASC 

Répondre

0

GROUP BY est utilisé en conjonction avec les fonctions d'agrégat. Je ne vois pas votre fonction d'agrégat? Avez-vous vraiment besoin du groupe?

1

Le problème est très probablement GROUP BY. Cela ne renverra qu'un enregistrement par ID de panier, même s'il y a plusieurs produits dans le panier. Pour obtenir ce que vous voulez, essayez ceci:

 
SELECT sb_carts.cart_id, sb_carts.product_sku 
FROM sb_carts 
INNER JOIN sb_products ON sb_products.sku = sb_carts.product_sku 
AND sb_products.school_id = sb_carts.school_id 
WHERE sb_carts.order_id = 0 
AND sb_carts.user_id = 2 
ORDER BY sb_carts.cart_id 

qui renverra deux colonnes (le panier ID et SKU) au lieu d'un, et tous les éléments pour l'un chariot ID apparaît sous forme de lignes consécutives dans la requête.

+0

Oui, c'est exactement le cas. MySQL ne vous force pas à utiliser des fonctions d'agrégat si vous utilisez GROUP BY (contrairement à MS-SQL par exemple, où cette requête ne serait pas valide) –

1

Pourquoi utilisez-vous la déclaration Group By? Si vous n'utilisez pas une fonction dans le Select comme Sum, AVG, etc n'a aucun sens pour votre porpouse. Donc, essayez d'exécuter la requête sans l'instruction Group By :-)

Espérons que ça aide!

Santi! :-)

+0

Mes requêtes complètes utilisent count pour regrouper des produits similaires pour agir en quantité. SELECT COUNT (DISTINCT sb_carts.cart_id) en tant que quantité, – bertsisterwanda

0

Mysql INNER JOIN sur plusieurs touches:

SELECT * from table1 as t1 
INNER JOIN table2 as t2 
ON CONCAT(t1.key1, t2.key2)=CONCAT(t2.key1, t2.key2); 

Ce que nous faisons ici est la combinaison de deux valeurs de clés et le faire ressembler est une clé.