sql >> Base de Datos >  >> RDS >> Mysql

MySQL Necesita ayuda para construir una consulta:unir varias tablas en una sola fila

Creo que lo simplificó demasiado en alguna parte. La consulta que cita devolvería exactamente lo que ya desea. Aquí hay un ejemplo (seleccionar de una sola tabla dos veces da una situación similar a la que tiene)

mysql> select * from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
+------+------+------+------+
| a    | b    | a    | b    |
+------+------+------+------+
|    1 |    2 |    1 |    1 | 
|    1 |    1 |    1 |    2 | 
|    1 |    2 |    1 |    2 | 
|    2 |    2 |    2 |    2 | 
|    2 |    2 |    2 |    2 | 
+------+------+------+------+
5 rows in set (0.00 sec)

Mysql no tiene problemas para etiquetar las columnas del conjunto de resultados con las mismas etiquetas. Supongo que su consulta original había seleccionado t1.* en la parte seleccionada.

Si desea hacer referencia a campos individuales cuyos nombres son ambiguos obtendrá

mysql> select a from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
ERROR 1052 (23000): Column 'a' in field list is ambiguous

Y debe especificar exactamente lo que desea (los alias de columna son opcionales, puede hacer t1., t2. también)

mysql> select t1.a first, t2.a second from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
+-------+--------+
| first | second |
+-------+--------+
|     1 |      1 | 
|     1 |      1 | 
|     1 |      1 | 
|     2 |      2 | 
|     2 |      2 | 
+-------+--------+
5 rows in set (0.00 sec)

Editar 22MARDespués de un cambio en los datos de muestra, parece que desea convertir varias filas de una tabla en una sola. Aquí hay una solución particular (suponiendo que siempre tendrá filas de impuestos, totales y subtotales y que solo está interesado en estos filas).

SELECT t1.id, t1.name, t2.product_id, t2.price, t3a.number subtotal, t3b.number total, t3c.number tax
FROM `table_one` AS t1 
INNER JOIN `table_two` AS t2 ON t1.id = t2.id 
INNER JOIN `table_three` AS t3a ON t1.id = t3a.id and t3a.text = "Subtotal"
INNER JOIN `table_three` AS t3b on t3a.id = t3b.id and t3b.text = "Total"
INNER JOIN `table_three` AS t3c on t3b.id = t3c.id and t3c.text = "Tax"

(si lo desea, también puede seleccionar las constantes "Impuesto", "Total" y "Subtotal" en la parte de selección y darles algunos nombres de columna)

Una cosa que no está clara es la relación entre las identificaciones en las tablas:¿son la clave principal de table_one o table_two? Eso puede influir en los resultados, por supuesto, cuando tenga varias filas en table_one y table_two.