2011-06-20 3 views
3

J'ai trois tables simples, comme indiqué ci-dessous:Combinant plusieurs colonnes

+----+-------------+ +----+-----------+ +----+---------------+ 
| artists   | | albums   | | songs    | 
+----+-------------+ +----+-----------+ +----+---------------+ 
| id | name  | | id | name  | | id | name   | 
+----+-------------+ +----+-----------+ +----+---------------+ 
| 0 | The Beatles | | 0 | Help!  | | 0 | Help!   | 
| 1 | Metallica | | 1 | Metallica | | 1 | Enter Sandman | 
+----+-------------+ +----+-----------+ +----+---------------+ 

Et je voudrais une requête pour le résultat suivant:

+--------+---------------+ 
| type | name   | 
+--------+---------------+ 
| artist | The Beatles | 
| artist | Metallica  | 
| album | Help!   | 
| album | Metallica  | 
| song | Help!   | 
| song | Enter Sandman | 
+--------+---------------+ 

Je suis en train d'utiliser une requête LIKE à Rechercher des artistes, des albums et des morceaux.

En ce moment j'utilise le SQL ci-dessous pour saisir les résultats des trois colonnes, puis j'utilise Ruby pour les rassembler en un seul objet. Je pense qu'il serait beaucoup plus efficace d'utiliser du SQL pur plutôt que le langage interprété pour renvoyer les résultats.

SELECT name FROM artists WHERE name LIKE 'something%' 
SELECT name FROM albums WHERE name LIKE 'something%' 
SELECT name FROM songs WHERE name LIKE 'something%' 

Je ne suis pas si grand avec SQL et ont été aux prises avec cela pendant quelques jours et je me demandais si quelqu'un ici pourrait me diriger dans la bonne direction.

Répondre

1

Vous pourriez, comme d'autres l'ont suggéré, utiliser UNION. Cependant, la sémantique de UNION force la base de données à éliminer les lignes en double qui nécessitent généralement une opération de tri. Puisque vous savez que chaque requête renvoie nécessairement des lignes non dupliquées, il serait plus efficace d'utiliser UNION ALL. Quelque chose comme

SELECT * 
    FROM (SELECT 'artists' as type, name 
      FROM artists 
     UNION ALL 
     SELECT 'albums' as type, name 
      FROM albums 
     UNION ALL 
     SELECT 'songs' as type, name 
      FROM songs) 
WHERE name LIKE 'something%' 

moteur base de données Tout ce que vous utilisez doit être capable de pousser le prédicat sur NAME dans chacune des trois branches qui sont UNION ALL'ed ensemble. Mais cela vaut la peine de confirmer cela dans le plan de requête.

+0

Je pensais à la façon de faire exactement cela avec les autres réponses. Bravo! – RyanScottLewis

2

Vous pouvez utiliser UNION pour joindre des résultats similaires. Essayez ceci:

SELECT 'artist' as Type, name FROM artists WHERE name LIKE 'something%' 
UNION SELECT 'album' as Type, name FROM albums WHERE name LIKE 'something%' 
UNION SELECT 'song' as Type, name FROM songs WHERE name LIKE 'something%' 
+0

J'ai déjà rencontré cette réponse auparavant. Le problème ici est que j'ai besoin de savoir à quelle table se trouve chaque résultat. Merci pour votre réponse rapide! Edit: Bah, j'ai raté la partie 'AS' de la requête. = p – RyanScottLewis

1

Vous devez utiliser syndicat pour fusionner les résultats dans un seul ResultSet, et aussi hardcode le type que vous voulez selon le tableau ..

SELECT 'artist' as [type], name FROM artists WHERE name LIKE 'something%' 
UNION 
SELECT 'album' as [type], name FROM albums WHERE name LIKE 'something%' 
UNION 
SELECT 'song' as [type], name FROM songs WHERE name LIKE 'something%' 
0
select 'artists' as type, name from artists where name like '%something%' 
union 
select 'albums' , name from albums where ... 
union 
select 'songs', name from songs where ... 
1

Utiliser union avec chaîne constante comme une colonne pour le résultat, comme

 select 'artist' as type, name as name from artists 
union select 'album' as type, name as name from albums 
union select 'song' as type, name as name from songs 
Questions connexes