【问题标题】:How can I join two tables to get an output in a view如何连接两个表以在视图中获取输出
【发布时间】:2021-10-25 18:12:21
【问题描述】:

我正在尝试通过执行 amount*price_for_each 来计算交易的总价值。

例如,5 个大蒜、8 个面包、1 个鸡肉和 1 个米饭。大蒜(从物品)的价格是25,面包是200,鸡肉是450,米饭是200。5⋅25+8⋅200+1⋅450+1⋅200=2125

CREATE TABLE Items(
price_for_each INT,
name VARCHAR(20),
PRIMARY KEY(name)
);

CREATE TABLE ItemsInTransactions(
name VARCHAR(20),
t_id INT,
amount INT,
FOREIGN KEY(name) references Items(name),
FOREIGN KEY(t_id) references Transactions(t_id)
);

CREATE VIEW TransactionValue AS
SELECT DISTINCT t_id,sum(amount*price_for_each) as value
FROM Items price_for_each, ItemsInTransactions amount 
GROUP BY t_id
ORDER BY t_id;

我认为问题出在我看来,输出的值远高于预期,这使我相信存在算术错误(可能相乘太多)。如果有人可以解释一种更好的方法来计算我的输出,我们将不胜感激

enter image description here

【问题讨论】:

  • 此处无需执行 SELECT DISTINCT,您的 GROUP BY 不会返回重复项。 (事实上​​,这种组合引起了很多人的注意......)
  • 不要破坏你的问题。
  • 请勿以使发布的合理答案无效的方式编辑问题帖子。 help centerMeta Stack Exchangeuse text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。

标签: mysql sql join view


【解决方案1】:

FROM Items price_for_each, ItemsInTransactions amount 是旧的不推荐使用的交叉连接方式(生成 Items 和 ItemsInTransactions 记录的每个组合)。你想要一个内部连接:

FROM ItemsInTransactions amount
INNER JOIN Items price_for_each on price_for_each.name=amount.name

因此,您只需查找相关商品的每件价格。

其他一些 cmets:DISTINCT 在这里是多余的,您的 group by 已经确保每个 t_id 只有一行。表别名应该有助于记录您的查询正在做什么,或者只是允许您更简洁地引用表字段;在这里,您使用的别名描述了您从表中获得的内容,这并不是特别有用。

【讨论】:

    【解决方案2】:

    你正在使用交叉连接,它将结合所有可用的乌鸦

    最好总是使用连接

    CREATE VIEW TransactionValue AS
    SELECT t_id,sum(amount*price_for_each) as value
    FROM Items i JOIN  ItemsInTransactions iit ON i.name  = iit.name 
    GROUP BY t_id
    ORDER BY t_id;
    

    【讨论】:

    • 感谢您的回答,我似乎用这种方法得到了正确的输出。在旁注中,我刚刚编辑了我的问题,但我仍然收到了一个错误。你能发现我在任何地方都有的语法错误吗?
    • 为此,我必须查看原件,但它应该可以工作 dbfiddle.uk/… 如果您的意思是您的查询,那么您写的内容毫无意义,这就是为什么使用我的重写
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2016-06-22
    • 1970-01-01
    相关资源
    最近更新 更多