且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

MySQL需要帮助构造查询:将多个表合并为一行

更新时间:2023-11-22 13:33:22

我认为您在某处确实简化了太多. 您引用的查询将完全返回您想要的内容. 这是一个示例(从单个表中选择两次给出的情况与您所拥有的类似)

I think you did simplify it too much somewhere. The query you quote would return exactly what you want already. Here's an example (selecting from single table twice gives similar situation as what you have)

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可以使用相同的标签来标记结果集列. 我想您原来的查询在选择部分中选择了t1.*.

Mysql has no problem to label the result set columns with same labels. I guess that your original query had select t1.* in select part.

如果您要引用名称不明确的各个字段,则会得到

If you want to refer to individual fields whose names are ambiguous you'll get

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

您必须准确指定所需的内容(列别名是可选的,您也可以执行t1.,t2.).

And you have to specify exactly what you want (column aliases are optional, you can do t1., t2. as well)

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)

编辑22MAR 更改示例数据后,您似乎想要将一张表中的几行变成一张. 这是一个特殊的解决方案(假设您将始终具有税",总计"和小计"行,并且您仅对这些行感兴趣).

Edit 22MAR After a change in the sample data it seems that you want to turn several rows from one table into one. Here is a particular solution (assuming that you'll always have Tax, Total and Subtotal rows and that you are only interested in these rows).

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"

(如果需要,还可以在选择部分中选择常量"Tax","Total"和"Subtotal",并为其指定一些列名称)

(if you want you can also select constants "Tax", "Total" and "Subtotal" in the select part and give them some column names)

尚不清楚的是表中ID之间的关系-它们是table_one还是table_two的主键.当然,当table_one和table_two中有多行时,这可能会影响结果.

One thing that remains unclear is the relationship between id's in tables - are they primary key of table_one or table_two. That can influence the results, of course, when you will have multiple rows in table_one and table_two.