4

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

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

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

表一:

id  name          total
5   John Doe      20

表二:

id  product_id    price
5   51            17

表三:

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

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

谢谢!

——杰德

4

3 回答 3

4

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

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

于 2010-03-21T10:42:57.103 回答
1

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

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

于 2010-03-20T23:43:20.930 回答
1

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

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

于 2010-03-21T01:03:55.040 回答