【发布时间】:2021-08-13 07:12:27
【问题描述】:
我有 2 张桌子:
销售额:
| id | invoice | valid |
|---|---|---|
| 100 | IV001 | Y |
付款:
| id | master | amount | test |
|---|---|---|---|
| 110 | 100 | 200 | 100 |
| 111 | 100 | 300 | 100 |
| 112 | 101 | 400 | 101 |
然后我做了一个查询:
select master, sum(amount) amount from payment group by master
并按预期给出结果
| master | amount |
|---|---|
| 100 | 500 |
| 101 | 400 |
但是当我运行以下查询时:
select s.id, s.invoice, p.amount from sales s join (select `master`, sum(amount) amount from payment group by `master`) p on p.`master`=s.id
我得到了这样的错误结果
| id | invoice | amount |
|---|---|---|
| 100 | IV001 | 900 (should be 500) |
但是,如果我使用列test 作为组列,结果会没问题。
我运行这个查询:
select s.id, s.invoice, p.amount from sales s join (select test, sum(amount) amount from payment group by test) p on p.test=s.id
一切看起来都和预期的一样。
我猜这与保留字列master 相关,我已经使用了反引号(`)。
我的问题是:如果我仍然想使用master 作为列名,如何解决这个问题?还是 Mariadb / Mysql 错误?
(我在 Ubuntu 21.04 上运行 Mariadb 版本 10.3 和 10.5)
编辑
请观看此视频:https://youtu.be/e2EEin1mf-E
提前致谢。
【问题讨论】:
-
欢迎来到 Stack Overflow。当我将第二个查询更正为“on p.
master= s.id”而不是 = m.id... 对我有用(总共 500 个)。当我尝试您指出的语句时,我收到关于未知列“m.id”的错误如果该语句被接受为书面,那肯定是一个错误。您正在运行什么版本的 mySQL? (我不记得 master 是一个保留字。使用 MySQL 8.0 时,无论有没有引号,我都不会出错。 -
哎呀,对不起我关于“on p.master = m.id”的错误,它必须是“on p.master = s.id”(已经编辑)。我使用的是 Mariadb 10.3 版,我在本地服务器和使用相同版本 Mariadb 的托管服务提供商上都得到了奇怪的结果。
-
另外我在 Ubuntu 21.04 上运行 Mariadb 10.5 版,它给出了相同(错误)的结果。
-
未转载。 dbfiddle.uk/…
-
列 id 和 master 的数据类型是 varchar 而不是整数。我尝试使用@Akina 代码按预期工作。但我的数据由 php 代码提供。我尝试使用“on trim(p.master)=s.id”修改查询,结果还可以。我也尝试
select * from payment where master=trim(master)显示所有数据,这意味着主列中没有空间。但是为什么要通过包含字符串来分组呢?还是我错了???我还是不明白为什么会这样。
标签: mysql subquery master reserved-words