Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL Precisa de ajuda para construir consulta:junte várias tabelas em uma única linha


Acho que você simplificou muito em algum lugar. A consulta que você cita retornaria exatamente o que você já deseja. Aqui está um exemplo (selecionar de uma única tabela duas vezes fornece uma situação semelhante à que você tem)
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 não tem nenhum problema em rotular as colunas do conjunto de resultados com os mesmos rótulos. Eu acho que sua consulta original tinha select t1.* na parte select.

Se você quiser se referir a campos individuais cujos nomes são ambíguos, você obterá
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

E você precisa especificar exatamente o que deseja (alias de coluna são opcionais, você pode fazer t1., t2. também)
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 22MARApós uma alteração nos dados de amostra, parece que você deseja transformar várias linhas de uma tabela em uma.Aqui está uma solução específica (assumindo que você sempre terá linhas de Imposto, Total e Subtotal e que você só está interessado nessas linhas).
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"

(se você quiser, você também pode selecionar as constantes "Tax", "Total" e "Subtotal" na parte selecionada e dar a elas alguns nomes de coluna)

Uma coisa que ainda não está clara é a relação entre os id's nas tabelas - eles são a chave primária de table_one ou table_two. Isso pode influenciar os resultados, é claro, quando você tiver várias linhas em table_one e table_two.