2010-07-30 7 views
0

Étant donné les tableaux suivants:SQL complex'ish rejoint sur plusieurs tables avec de multiples conditions à travers toutes les tables

labels    tags_labels 
|id |name |  |url |labelid | 
|-----|-------|  |/a/b |1  | 
|1 |punk |  |/a/c |2  | 
|2 |ska |  |/a/b |3  | 
|3 |stuff |  |/a/z |4  | 

artists    tags 
|id |name |  |url |artistid |albumid | 
|----|--------|  |------|-----------|---------| 
|1 |Foobar |  |/a/b |1   |2637  | 
|2 |Barfoo |  |/a/z |2   |23  | 
|3 |Spongebob| |/a/c |1   |32  | 

Je voudrais obtenir une liste des urls qui correspondent à deux conditions (qui peut être saisie par l'utilisateur dans le script qui utilise ces instructions). Par exemple, l'utilisateur peut vouloir lister toutes les URL qui ont les étiquettes "(1 OR 2) ET 3", mais seulement si elles sont par les artistes "Spongebob OU Whatever".

Est-il possible de le faire dans une seule instruction en utilisant les jointures internes/harry potter/cross/self? Ou devrais-je répartir la requête sur plusieurs instructions et mettre en tampon les résultats dans mon script?

Editer:
Et si c'est possible, à quoi ressemblerait la déclaration? : p

+1

Harry Potter ??? –

Répondre

0

Oui, vous pouvez le faire dans une requête. Et peut-être un moyen efficace serait de générer dynamiquement l'instruction SQL, en fonction des conditions que l'utilisateur a saisies.

+0

Mon mauvais; aurait dû mentionner que je suis également à la recherche de la requête pour les gouverner tous;) – user407159

0

Cette requête vous permet de filtrer par nom d'étiquette ou par nom d'artiste. Construire l'sql dynamique pour concaténer les paramètres utilisateur ou passant les paramètres désirés dans une procédure stockée serait évidemment changer les clauses where, mais cela dépend vraiment de la façon dynamique votre « script » doit être ...

SELECT tl.url 
FROM labels l INNER JOIN tags_labels tl ON l.id = tl.labelid 
WHERE l.name IN ('ska','stuff') 
UNION (
SELECT t.url 
FROM artists a INNER JOIN tags t ON a.id = t.artistid 
WHERE a.name LIKE '%foo%' 
) 

Bonne chance!

+0

Hmm merci, mais ce n'est pas la réponse que je cherchais. Plus important encore, il n'aborde pas le problème de la création d'une liste qui permet d'ET les identifiants d'étiquettes. Dans la table d'origine, il n'y a pas d'entrée unique avec 2 étiquettes ... – user407159

+0

Désolé, cela signifie que tags_labels n'a pas de ligne avec 2 ID tag. – user407159

+0

Je ne comprends pas "créer une liste qui permette d'ET les identifiants d'étiquette". Qu'est-ce que tu dis? – Tahbaza

Questions connexes