2010-08-19 3 views
2

Merci pour votre aide, j'ai posté une version simplifiée de mon problème, mais je ne comprenais pas vraiment comment appliquer la gauche se joindre à la grande qui est la suivante:mysql choisir parmi un ou une autre table

SELECT d.type, 
     d.item , 
     if(d.type='I', a.name, b.name) as name, 
     if(d.type='I', c.price,0) as price, 
     if(d.type='I',if(d.taxes='yes', 
     (c.priceWithTax*d.weight), (c.price*d.weight)),0) as totalprice 
    FROM d 
inner join a on d.item=a.id 
inner join c on d.item=c.item 
    where c.sede =1 

Le problème est que lorsque d.type = 'I' j'ai besoin des éléments de la table a, mais si d.type = 'S' j'ai besoin des éléments de la table B, les prix sont sur la table c.

Merci beaucoup.

+2

Pouvez-vous s'il vous plaît rendre votre question plus claire? Peut-être un exemple du monde réel pourrait aider? –

+0

Je crois qu'il demande comment il peut rejoindre sur la table C seulement si b.col2 = apple –

Répondre

0
select 
    a.col1, 
    b.col1, 
    coalesce(c.col1,0) 
from a inner join b on a.col0=b.col1 
    left outer join c on b.col2='apple' and c.col1=b.col0 

choses à apprendre:

  • outer joins
  • fonction COALESCE()
  • usage unique guillemets pour les chaînes littérales dans SQL, pas des guillemets doubles

J'ai une table rawFood, une table de cookedFood et une table de menu et la table de menu a des choses à la fois, rawFood et cookedFood, c'est pourquoi je dois rejoindre cette façon

Vous devez avoir une seule table food et donnez-lui une colonne qui fait la différence entre la nourriture crue et celle cuite.

+0

Merci, pour votre aide, j'ai posté une version simplifiée de mon problème mais je n'ai pas vraiment compris comment appliquer la jointure gauche dans la grande qui est: SELECT d.type, d.item, if (d.type = 'I', a.name, b.name) comme nom, if (d.type = 'I', c.prix, 0) comme prix, if (d.type = 'I', if (d.taxes = 'oui', (c.priceWithTax * d.weight), (c.price * d.weight)), 0) en tant que prix total FROM d inner rejoindre un d .item = a.id jointure interne c sur d.item = c.item où c.sede = 1 Le problème est que lorsque d.type = 'I' j'ai besoin des éléments de la table a, mais si d.type = 'S' J'ai besoin des articles de la table B, les prix sont sur la table c. Merci beaucoup. – notforever

0

Si vous avez besoin de quelque chose comme ceci, cela indique clairement que la structure de votre base de données est incorrecte.
Il devrait être une table, et votre requête devient simple et facile.

+0

merci pour la réponse Colonel Shrapnel, le problème est que j'ai une table rawFood, une table cookedFood et une table de menu et la table de menu a des choses à la fois, rawFood et cookedFood, c'est pourquoi j'ai besoin de rejoindre de cette façon – notforever

+0

@notforever mais il doit y avoir une table, avec un champ nommé "raw" (ou "cuit" - peu importe). C'est une règle de base de données très basique. Toutes les données similaires doivent être dans une table. Ou vous serez dans des problèmes constants comme celui-ci –

0

Vous pouvez utiliser une jointure gauche

select 
    a.col1, 
    b.col1, 
    ifnull(c.col1,0) 
from a 
    inner join b on a.col0=b.col1 
    left join c on (c.col1 = b.col0 and b.col2="apple") 
where 
    b.col2 != "apple" or (b.col2 = "apple" and c.col1 is not null) 
+0

Merci, pour votre aide, j'ai posté une version simplifiée de mon problème mais je n'ai vraiment pas compris comment appliquer la jointure gauche dans la grande qui est la suivante: SELECT d.type, d.item, if (d .type = 'I', a.name, b.name) comme nom, if (d.type = 'I', c.prix, 0) comme prix, if (d.type = 'I', if (d .taxes = 'oui', (c.priceWithTax * d.weight), (c.price * d.weight)), 0) comme prix total FROM d inner rejoindre a on d.item = a.id jointure interne c sur d.item = c.item où c.sede = 1 Le problème est que lorsque d.type = 'I' j'ai besoin des éléments de la table a, mais si d.type = 'S' I besoin des articles de la table B, les prix sont sur la table c. Merci beaucoup. – notforever

Questions connexes