2017-07-28 1 views
0

Salut je dois obtenir des données à partir d'une base de données, mais je ne peux pas comprendre comment ne le faire comme il est ...MYSQL Rejoignez 2 tables avec 2 relations Table

Ils ont des « boutiques » et des tables « boutiques_categories » et une table de relation entre les nommer « boutiques_categories_categories »

ici comment ils sont configurés:

boutiques 
id name 
1  X_boutiques2_name 
2  Y_boutiques_name 

Boutique2 
id name 
1 X_boutiques2_name 
2 Y_boutiques2_name 

boutiques_categories 
id name 
1 X_categorie_name 
2 Y_categorie_name 

boutiques_categories_categories 
boutique_id    categorie_id 
X_boutique_id   X_categorie_id 
Y_boutique_id   Y_categorie_id 

Je veux créer un SQL pour fusionner et imprimer un fichier CSV des données comme ceci:

export 
boutiques_id boutique_name  boutiques_categories_categorie_name 
boutiques2_id boutique2_name boutiques_categories_categorie_name 

J'essaie UNION les 2 Table

SELECT A.* 
FROM boutiques A 
UNION select B.* FROM boutiques2 B 

Et cela fonctionne, mais maintenant je dois être inscrit le nom de catégorie à elle et je ne peux pas comprendre comment le faire. Essayé:

SELECT A.* 
FROM boutiques A 
UNION select B.* 
FROM boutiques2 B 
left join 
    boutiques_categories BC ON BC.id = 
    (
    SELECT BCC.categorie_id 
    FORM 
     boutiques_categories_categories BCC 
    WHERE BCC.boutique_id = BC.id 
    ) 

Mais j'obtiens l'erreur MYSQL que je ne peux pas résoudre.

#1242 - Subquery returns more than 1 row 

Merci pour votre temps.

+0

Vous n'avez pas besoin d'utiliser 'union'. Cela est utilisé pour renvoyer plusieurs instructions select en tant que résultat unique. La syntaxe 'join' est tout ce dont vous avez besoin. – RToyo

+0

Mais j'ai besoin d'avoir plusieurs instructions select car j'ai besoin de sélectionner les données dans les boutiques et boutique2 puis d'ajouter le nom de la catégorie aux données de la boutique. –

+1

Désolé, j'étais sur le point d'éditer mon commentaire après avoir relu votre question. Vous avez raison au sujet du syndicat. Je rédigerai une requête sous peu, si personne d'autre ne répond entre-temps. – RToyo

Répondre

2

Vous pouvez union (ou union all, en fonction des données que vous souhaitez) boutiques et Boutique2 dans une table dérivée, puis joignez-la à boutiques_categories via boutiques_categories_categories.

Les données de table que vous avez incluses dans votre question ne semblent pas complètement exactes. Plus précisément: boutiques_categories_categories contenant des valeurs boutique_id et categorie_id qui ne correspondent pas aux colonnes id des tables associées. Je vais juste supposer que les boutiques_categories_categories ont des valeurs d'ID int. Si ce n'est pas le cas, veuillez clarifier dans les commentaires, et je peux ajuster la requête de manière appropriée.

Donner cette requête essayer et voir si elle renvoie les données que vous attendez:

select 
    b.id, b.name, c.name 
from 
    -- Get the boutiques rows from the unioned tables 
    (
     select id, name from boutiques 
     union 
     select id, name from Boutique2 
    ) as b 
    -- Join in boutiques_cateogires_categories 
    join boutiques_categories_categories cc 
     on (b.id=cc.boutique_id) 
    -- Join in boutiques_categories 
    join boutiques_categories c 
     on (cc.categorie_id=c.id) 
+0

Merci! C'est exactement ce dont j'avais besoin! Désolé si ma question n'était pas très claire mais vous l'avez eu juste. –

+1

@SebastienB. Heureux que ça a marché pour vous! Ne t'inquiète pas pour ta question. Pour référence ultérieure, il est préférable de présenter un exemple exact de vos données, puis de l'expliquer séparément. Donc, plutôt que d'écrire «X_boutique_id» dans la colonne «boutique_id», vous devez simplement écrire «1», puis utiliser le corps de votre question pour expliquer «la colonne boutique_id correspond à l'identifiant de la table boutique». – RToyo