Tengo varias tablas con diferentes números y tipos de columnas, y una sola columna en común.¿Cómo combinar resultados de múltiples tablas con diferentes columnas?
+--------+---------+------------+-------------+
| person | beardID | beardStyle | beardLength |
+--------+---------+------------+-------------+
+--------+-------------+----------------+
| person | moustacheID | moustacheStyle |
+--------+-------------+----------------+
Quiero obtener todos los resultados que coinciden con un valor dado de la columna compartida. Puedo hacerlo mediante múltiples sentencias de selección como esta:
SELECT * FROM beards WHERE person = "bob"
y
SELECT * FROM moustaches WHERE person = "bob"
Pero esto requiere múltiples llamadas a la API MySQL, lo que parece ineficiente. Esperaba poder usar UNION ALL para obtener todos los resultados en una sola llamada API, pero UNION requiere que las tablas tengan el mismo número y tipo similar de columnas. Podría escribir una instrucción SELECT que rellenaría manualmente los resultados de cada tabla al agregar columnas con valores NULL, pero eso se volvería rápidamente inmanejable para unas pocas tablas más con algunas columnas más.
Estoy buscando a un conjunto de resultados más o menos así:
+--------+---------+------------+-------------+-------------+----------------+
| person | beardID | beardStyle | beardLength | moustacheID | moustacheStyle |
+--------+---------+------------+-------------+-------------+----------------+
| bob | 1 | rasputin | 1 | | |
+--------+---------+------------+-------------+-------------+----------------+
| bob | 2 | samson | 12 | | |
+--------+---------+------------+-------------+-------------+----------------+
| bob | | | | 1 | fu manchu |
+--------+---------+------------+-------------+-------------+----------------+
¿Hay una manera de lograr esto que es rápido y fácil de mantener? ¿O será mejor que ejecute una consulta separada para cada tabla?
Aclaración:
no estoy en busca de un producto cartesiano. No quiero una fila para cada combinación de barba y bigote, quiero una fila para cada barba y una fila para cada bigote.
Así que si hay 3 barbas a juego y 2 bigotes coincidentes que deben recibir 5 filas, no 6.
Si bien se podría hacer en la mayoría de las bases de datos con un 'FULL JOIN', y en MySQL con la solución de ITroubs, dudo seriamente de que se obtenga una ganancia de rendimiento significativa, y probablemente solo estés creando un lío de código oscuro por el que su sucesor no le agradecerá. El código claro y preciso supera una ganancia de rendimiento en los porcentajes muy bajos en la mayoría de las circunstancias. – Wrikken