当前位置: 首页 > 面试题库 >

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

丌官信厚
2023-03-14
问题内容

如果已经提出并回答了这个问题,请原谅我,我已经搜索并找到了一些看起来相似的东西,但是我对SQL的新手知识太多,无法适应他们的需求。如果我不使用正确的术语,也请原谅我,我知道当有人问一个问题并且他们甚至不知道能够问他们需要什么时,这可能会很烦人。

< 第二次编辑3月22日:>

好的,我不了解源数据的实际外观,这就是为什么我无法获得想要的东西。感谢@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

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

< / EDIT 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

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

谢谢!


问题答案:

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

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中有多行时,这可能会影响结果。



 类似资料:
  • 问题内容: 结合这两个查询的正确语法是什么? 和 我试过了: 但我收到“ UNION和ORDER BY的用法不正确”。 编辑 此外,我希望结果在一行中返回。这样我就可以访问php中的值,例如 根据西蒙的建议,我不应该使用UNION,因为我想返回一行数据 问题答案: 您不能先进入,然后再进入。 编辑 但是你可以 将ORDER BY或LIMIT应用于单个SELECT,将子句放在包围SELECT的括号内

  • 问题内容: 使用wordpress数据库,我们有wp_options和wp_postmeta之类的表。这些按主键ID分组,然后按“ option_name”和“option_value”之类的字段分组; 因此,例如,要找出三个值,我需要执行3个不同的查询。 是否有适当的方法仅通过一个查询来完成所有这些操作? 请对此有所了解,并分享正确的方法。 (返回example.com,Example Blog

  • 本文向大家介绍MySQL查询将两列合并为一个列?,包括了MySQL查询将两列合并为一个列?的使用技巧和注意事项,需要的朋友参考一下 您可以为此使用功能。在该函数中,它从列中返回第一个NON NULL值。为了理解这个概念,让我们首先创建一个演示表 使用insert命令在表中插入一些记录。查询如下- 现在,您可以使用select语句显示表中的所有记录。查询如下- 以下是输出 这是将两列合并为一个查询的

  • 我的问题类似于SQL选择组查询。但是架构发生了变化,我想要不同的结果,如下所述。给定链接的解决方案没有给我正确的解决方案。您可以使用SQL小提琴来解决这个问题。 下面是我的桌子 表1 现在,我想显示每个产品的两个最低金额,如果金额相同,那么任何人都按照升序排列... 所以我想构建单个SQL查询,它给我的结果如下。 请帮我建立这样的查询。

  • 问题内容: 我想从t1中获取名称,并在t2中获得与ID在t1上相同的行数。 到目前为止,我已经掌握了上述内容,但是如果t2中没有匹配的行,它将不会返回任何数据。如果没有行,则我希望将其设置为0(或NULL),并且名称仍然返回。 编辑: 我希望能够按降序排序。(或ASC)可行吗? 问题答案: 这应该为您工作: 左联接确保您拥有t1中的所有行,而COUNT(。)使其仅计算t2.id不为null的记录(

  • 问题内容: 我想从一个名为Sorels的表更新一个名为的表。它们之间的链接是的等于Sorels表的。这是我对Merge语句的第一次尝试,并且我正在尝试学习语法。 运行此命令时,出现以下错误: 错误10/22/2009 1:38:51 PM 0:00:00.000 SQL Server数据库错误:关键字’ON’附近的语法不正确。46 0 添加的信息* 在建议了第一个修复程序之后,代码如下: 现在我得