Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Besoin d'aide pour construire une requête :joindre plusieurs tables en une seule ligne

Je pense que vous l'avez trop simplifié quelque part. La requête que vous citez renverrait exactement ce que vous voulez déjà. Voici un exemple (sélectionner deux fois dans une seule table donne une situation similaire à celle que vous avez)

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'a aucun problème à étiqueter les colonnes de l'ensemble de résultats avec les mêmes étiquettes. Je suppose que votre requête d'origine avait sélectionné t1.* dans la partie select.

Si vous souhaitez faire référence à des champs individuels dont les noms sont ambigus, vous obtiendrez

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

Et vous devez spécifier exactement ce que vous voulez (les alias de colonne sont facultatifs, vous pouvez faire t1., t2. aussi)

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)

Modifier 22MARAprès une modification des données de l'échantillon, il semble que vous souhaitiez transformer plusieurs lignes d'une table en une seule. Voici une solution particulière (en supposant que vous aurez toujours des lignes Taxe, Total et Sous-total et que vous n'êtes intéressé que par celles-ci lignes).

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 vous le souhaitez, vous pouvez également sélectionner les constantes "Taxe", "Total" et "Sous-total" dans la partie de sélection et leur donner des noms de colonne)

Une chose qui reste floue est la relation entre les identifiants dans les tables - sont-ils la clé primaire de table_one ou table_two. Cela peut influencer les résultats, bien sûr, lorsque vous aurez plusieurs lignes dans table_one et table_two.