A menudo me encuentro realizando un par de independientes se une a una mesa. Por ejemplo, supongamos que tenemos la tabla collections
, que tiene relaciones independientes de uno a N con photos
y songs
, donde N es de cero a muchos.En lugar de unir de forma independiente varias tablas, ¿usar consultas por separado?
Ahora, digamos que queremos obtener una colección, y ambos sus fotos y canciones (independientemente) asociadas.
que se utilizan normalmente algo como esto:
SELECT
collections.collectionid as collectionid,
photos.name as photo_name,
songs.name as song_name
FROM collections
LEFT JOIN photos ON collections.collectionid = photos.collectionid
LEFT JOIN songs ON collections.collectionid = songs.collectionid
WHERE collections.collectionid = 14
Por supuesto, dada a participar en una mesa a otras dos tablas, si la primera combinación da como resultado M
filas y el segundo en N
filas, da M * N
filas . Esto parece poco óptimo en términos de tráfico de base de datos y rendimiento.
+--------------+------------+-----------+
| collectionid | photo_name | song_name |
+--------------+------------+-----------+
| 14 | 'x' | 'a' | \
| 14 | 'x' | 'b' | - Each photo is returned 3 times,
| 14 | 'x' | 'c' |/because 3 songs are returned.
| 14 | 'y' | 'a' | \
| 14 | 'y' | 'b' |
| 14 | 'y' | 'c' |/
+--------------+------------+-----------+
Como alternativa, se pueden realizar dos casillas: dos consultas separadas, cada una de unirse collections
a una mesa diferente, dando M + N
filas:
SELECT
collections.collectionid as collectionid
song.name as song_name
FROM collections
LEFT JOIN songs on collections.collectionid = songs.collectionid
WHERE collections.collectionid = 14
y:
SELECT
collections.collectionid as collectionid
photos.name as photo_name
FROM collections
LEFT JOIN photos on collections.collectionid = photos.collectionid
WHERE collections.collectionid = 14
dando:
+--------------+------------+ +--------------+------------+
| collectionid | song_name | | collectionid | photo_name |
+--------------+------------+ +--------------+------------+
| 14 | 'a' | | 14 | 'x' |
| 14 | 'b' | | 14 | 'y' |
| 14 | 'c' | +--------------+------------+
+--------------+------------+
Mi pregunta: ¿Cuál es la mejor manera de manejar esto?
Ninguno de los anteriores parece óptimo. Entonces, ¿hay otra manera de que resulte en filas M + N
, pero se puede hacer en una sola consulta?
En MySQL puede usar 'group_concat' para devolver 1 fila por grupo. No tengo idea de las implicaciones de rendimiento. –
Gracias Martin. Whoa, funky. Por lo que puedo ver, eso agrega los resultados después de la generación, por lo tanto, no cambia el problema de rendimiento "M *" de la consulta en sí. Sin embargo, como reduce el número de filas, debería reducir la longitud de los bucles, en PHP decir, que llaman 'mysql_fetch_assoc'. –
Así es como las uniones funcionan en SQL, casi necesita 2 consultas si no se desea este resultado. – nos