2011-05-02 8 views
0

Je suis tout nouveau dans la programmation SQL et j'ai un peu de mal. J'ai le script MySQL suivant:MySQL SELECT avec la colonne NULL conditionnelle

SELECT 
    MyPrimaryTable.PrimaryKey, Alias1.String AS Output1, 
    CASE 
     WHEN Id2 IS NOT NULL THEN Alias2.String 
     ELSE "" 
    END AS Output2 
FROM MyPrimaryTable, MySecondaryTable AS Alias1, MySecondaryTable AS Alias2 
WHERE 
    MyPrimaryTable.Id1 = Alias1.Id1 
    AND ((MyPrimaryTable.Id2 IS NULL) OR (MyPrimaryTable.Id2 = Alias2.Id2)); 

Fondamentalement, j'ai une table primaire qui contient deux ID, ID1 et ID2, et je suis en train d'associer chacun de ces numéros d'identification avec une chaîne dans une table secondaire et afficher ces chaînes dans le résultat SELECT. Cependant, le deuxième ID de la table primaire est autorisé à être NULL. La sortie que je voudrais, dans ce cas, est la première chaîne comme prévu et la deuxième chaîne comme vide (""). Le script que j'ai écrit le fait, sauf qu'il ajoute une nouvelle ligne pour chaque chaîne possible, même si toutes les lignes se ressemblent.

Résultats attendus avec chaînes possibles Foo1, foo2, foo3 et Foo4, avec deux entrées de la table:

PK Output1 Output2 
1 Foo1 Foo4 
2 Foo2 

Ce que je reçois:

1 Foo1 Foo4 
2 Foo2 
2 Foo2 
2 Foo2 

Comment puis-je nettoyer ce et le faire fonctionner comme prévu? Merci.

EDIT: J'espérais ne pas utiliser DISTINCT parce que je veux l'utiliser dans une vue, et DISTINCT rendra la vue non modifiable.

+0

Avez-vous envisagé group_concat()? http://dev.mysql.com/doc/refman/5.0/fr/group-by-functions.html#function_group-concat –

Répondre

1

Essayez de regrouper avec

GROUP BY MyPrimaryTable.PrimaryKey 

à l'autre bout, vous pouvez joindre les tables pas OÙ

SELECT 
    MyPrimaryTable.PrimaryKey, 
    Alias1.String AS Output1, 
    CASE 
     WHEN Id2 IS NOT NULL THEN Alias2.String 
     ELSE "" 
    END AS Output2 
FROM MyPrimaryTable, 
    LEFT JOIN MySecondaryTable AS Alias1 ON MyPrimaryTable.Id1 = Alias1.Id1 
    LEFT JOIN MySecondaryTable AS Alias2 ON MyPrimaryTable.Id2 = Alias2.Id2 
+0

Merci! LEFT JOIN était exactement ce que je cherchais. – RawwrBag

+0

Malheureusement, cela ne semble pas mettre à jour correctement lorsqu'il est utilisé dans une vue, IE si j'essaie UPDATE Output1 SET String = "test" WHERE PrimaryKey = 1234' il semble remplacer toutes les instances de la chaîne d'origine avec "test", pas juste où le PK est 1234. Au dessus de votre tête savez-vous pourquoi cela pourrait être? – RawwrBag

+0

Nevermind, ignorer ce dernier commentaire, je suis bête - je devais éditer le numéro d'origine, pas la chaîne associée. Durp. – RawwrBag

Questions connexes