2012-07-04 18 views
16

Tengo 3 tablas en la base de datos SQLite:Ingreso 3 tablas en la base de datos SQLite

canciones:

_id | name | length | artist_id (foreign key) | album_id (foreign key) 

artistas:

_id | name 

Álbumes:

_id | name 

necesito una consulta (utilizarlo en una aplicación para Android) de una tabla que consta de las siguientes columnas:

_id | name | length | artist_id | artist_name | album_id | album_name 

Sin embargo, escribo la siguiente instrucción de consulta:

SELECT Songs._id, Songs.name, Songs.length, Songs.artist_id, Artists.name, Songs.album_id, Albums.name FROM Songs, Artists, Albums WHERE Songs.artist_id = Artists._id AND Songs.album_id = Albums._id 

pero me da una mesa vacía. Intenté OR en lugar de AND y da resultados incorrectos (cada canción se duplica en cada álbum, aunque el artista es correcto). ¿Cómo puedo arreglar mi declaración de consulta para unirme a las 3 tablas en una sola tabla?

Respuesta

33

Utilizando un JOIN explícito en lugar de uno implícito, el siguiente debería obtener lo que desea, aunque es curioso que su sintaxis de unión implícita no devolvió los resultados correctos en primer lugar. He usado un LEFT JOIN, para tener en cuenta las canciones que no tienen un artista o álbum asociado, pero que pueden no ser necesarias para su conjunto de datos y podría usarse un INNER JOIN en su lugar.

También he agregado alias de columna para eliminar la ambigüedad cuando busco filas, ya que tiene nombres de columna similares en la mayoría de las tablas (id, name).

SELECT 
    Songs._id AS song_id, 
    Songs.name AS song_name, 
    Songs.length, 
    Songs.artist_id AS artist_id, 
    Artists.name AS artist_name, 
    Songs.album_id AS album_id, 
    Albums.name AS album_name 
FROM 
Songs 
LEFT JOIN Artists ON Songs.artist_id = Artists._id 
LEFT JOIN Albums ON Songs.album_id = Albums._id 
+0

Estaba escribiendo lo mismo. Pero, probablemente necesitaría un 'LEFT JOIN' en caso de que una canción no tenga una etiqueta para un Arist o un álbum. – mawburn

+0

@MadBurn Solo estaba cambiando eso –

+0

Funciona genial. Mucho lo aprecio Gracias :) –

0

tratar sql combinación interna

  inner join Artists on Songs.artist_id = Artists._id 
1

Prueba esta selección, puede por el Artists es más importante que los demás, por lo que el Songs vienen a través Artists y Albums de Songs.

SELECT 
    Songs._id AS song_id, 
    Songs.name AS song_name, 
    Songs.length, 
    Songs.artist_id AS artist_id, 
    Artists.name AS artist_name, 
    Songs.album_id AS album_id, 
    Albums.name AS album_name 
FROM 
Artists 
LEFT JOIN Songs ON Songs.artist_id = Artists._id 
LEFT JOIN Albums ON Songs.album_id = Albums._id 

Además, si no hay ninguna entrada en Songs perteneciente a un artista en particular o ninguna entrada en Albums que pertenece a una canción en particular, todavía obtener la entrada del artista gracias a la LEFT JOIN. Si desea devolver solo artistas con canciones y álbumes, use JOIN en su lugar.

Cuestiones relacionadas