【问题标题】:MySQL Need help constructing query: join multiple tables into single rowMySQL需要帮助构造查询:将多个表连接成单行
【发布时间】:2010-03-20 23:37:20
【问题描述】:

如果有人提出并回答了这个问题,请原谅我,我已经搜索并找到了一些看起来相似的,但我对 SQL 太陌生了,无法根据我的需要调整它们。如果我没有使用正确的术语,也请原谅我,我知道当有人提出问题并且他们甚至没有足够的知识来询问他们需要什么时会很烦人。

好吧,我不明白源数据实际上是什么样的,这就是为什么我无法得到我想要的。感谢@goran 推动我将真正的源表发布到此处(我仍然不会发布,因为我懒得对它们进行适当的编辑以便于查看和保护无辜者,但我应该有至少在询问之前将它们打印出来)。下面是新修订的示例表,但我仍然没有弄清楚如何实现将所有内容放在一行中的最终目标。

table_one:

id  name          total
5   John Doe      20

table_two:

id  product_id    price
5   51            17

table_three:

id  text       number
5   Subtotal   17
5   Tax        3
5   Total      20

我正在寻找的是这样的:

id name     total product_id price text     number text number text   number
5  John Doe 20    51         17    Subtotal 17     Tax  3      Total  20

我不再确定以下信息的有效性,但我暂时将其留在这里,希望它不会让该问题的新读者感到困惑。

3 月 22 日>

我正在帮助一位朋友收集一些数据,并且需要执行一个查询,结果每条记录只有一行,但我得到了多行。这是我现在正在查询的示例(简化,希望不会太多):

SELECT * FROM `table_one` AS t1 
INNER JOIN `table_two` AS t2 ON t1.id = t2.id 
INNER JOIN `table_three` AS t3 ON t1.id = t3.id 
WHERE 1

结果是:

id  text       number
5   Subtotal   17
5   Tax        3
5   Total      20

我需要的是创建一个查询结果更像这样:

id  text       number  text  number  text   number
5   subtotal   17      Tax   3       Total  20

任何帮助/指导将不胜感激。

谢谢!

--杰德

【问题讨论】:

  • 您在不同的表格中是否有小计、税收和总计?或者您是否尝试合并每个都有小计、税收、总计的表格?我认为您的示例查询过于简单,查看真实的查询会有所帮助。
  • 是的,对不起,我会编辑澄清。
  • 您引用的查询,结果和样本数据不匹配。为什么不复制粘贴实际查询和结果?附言如果你真的想要一个有保证的明确答案,你也可以 mysqldump -c -n database table1 table2 table3 > table.sql 然后复制/粘贴相关的 INSERTS 和 CREATE TABLE 语句的相关部分,如果它不是太长的话。
  • @goran:感谢您的坚持和容忍。我将立即复制并粘贴实际的查询和结果。再次感谢,--jed
  • @goran:好的,只是试图获得真正的表格已经向我展示了我的方式的错误。我错误地认为每个表都有一个我想要组合的不同元素,但是一个表有多个我需要组合的行,这就是事情没有按照我预期的方式发展的原因。故事的寓意:在假设结果不正确之前,请确保您了解源数据的样子。我会尽快更新问题并提供更多信息。

标签: sql mysql mysql-error-1052


【解决方案1】:

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

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> 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.

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 更改示例数据后,您似乎希望将几行从一张表变成一张。 这是一个特定的解决方案(假设您总是有 Tax、Total 和 Subtotal 行,并且您只对这些行感兴趣)。

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”并给它们一些列名)

还有一点不清楚的是表中 id 之间的关系——它们是 table_one 还是 table_two 的主键。当然,当 table_one 和 table_two 中有多行时,这会影响结果。

【讨论】:

  • 我并没有真正简化查询,只简化了结果(实际结果大约有 50 列),虽然我更改了表的名称以使事情变得更容易一些(它们的名称是订单,订单总数和订单产品)。我不确定我是否完全理解您的示例,因为第一个示例显然是从单个表中选择的,当我尝试将三个表的输出合并在一起时(消除相等的重复项并复制不相等的重复项) .谢谢,--jed
  • 我的示例显示 a) mysql 客户端中列名的相同标签没有问题 b) 如何使用别名
  • @goran:“还有一点不清楚的是表中 id 之间的关系——它们是 table_one 还是 table_two 的主键。”老实说,我不知道。我很确定 table_one 和 table_two 每个 ID 都只有一行。再次感谢您的回答,我很确定我可以使您修改后的示例正常工作,因此无需任何额外的脚本即可解决我的问题。 --jed
  • 很高兴为您提供帮助,但如果您不知道您的表格是如何关联的,您也不能说您走在正确的轨道上。 :)
【解决方案2】:

至少因为您有同名的列,您将无法完全按照您的意愿获得结果。可能您可以通过重命名列来获得此结果,但这种方法将导致 hacky 代码和无法正确使用结果。

您应该重新考虑进一步使用返回的记录并对其进行更新,以便在 SQLselect 正常返回数据的情况下尽快处理实际结果。

【讨论】:

    【解决方案3】:

    您要求的输出不是关系,因为它的属性没有唯一的名称。所以期望关系数据库系统产生这样的结果是不合理的。这并不是说某些数据库系统可以破坏关系模型并在某些情况下产生非关系结果;但这不太可能是其中之一。

    因此,您应该让应用程序将关系作为输入并将其转换为您想要的输出。从 RDBMS 的角度来看,这是应用程序角色的主要部分。

    【讨论】:

    • 我可以接受这个答案,我愿意用脚本转换数据,但是如果有办法让 MySQL 以接近我需要的方式输出东西,那最好。非常感谢,--jed
    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 2011-09-23
    • 1970-01-01
    • 2012-02-21
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多