mysql - 如何正确构建这个查询?这是一个合适的 MySql 方案吗?

标签 mysql sql

我有这个数据库:

* net_sales
account_id (pk)
date (pk)
amount

* refund
account_id (pk)
date (pk)
amount

* fees
account_id (pk)
date (pk)
amount

* adjustment_3rd_party
account_id (pk)
date (pk)
amount

* corporate_charges
account_id (pk)
date (pk)
amount

虽然它们共享相同的 pk,但如果有新的变量需要考虑(这可能会),我会分开,但我不需要继续向表中添加列,而是可以创建另一个表并连接它们。

这就是我正在做的事情:

SELECT net_sales.amount, refund.amount, fees.amount, adjustment_3rd_party.amount, corporate_charges.amount
FROM net_sales
LEFT JOIN refund ON (refund.date = net_sales.date AND refund.account_id = net_sales.account_id)
LEFT JOIN fees ON (fees.date = net_sales.date AND fees.account_id = net_sales.account_id)
LEFT JOIN adjustment_3rd_party ON (adjustment_3rd_party.date = net_sales.date AND adjustment_3rd_party.account_id = net_sales.account_id)
LEFT JOIN corporate_charges ON (corporate_charges.date = net_sales.date AND corporate_charges.account_id = net_sales.account_id)
WHERE net_sales.account_id = 40394 AND net_sales.date = '2016-01-01';

我做错了什么吗?我收到了很多重复项,而且它们的数量都相同...

谢谢!

最佳答案

看起来问题不在于查询,而在于您的数据。

如果您对于一个 net_sales account_id 和日期组合有两项退款金额和两项费用金额,则此查询将返回四行,其中每个退款行与每个费用行都有唯一的组合。换句话说,它可能会按照您描述的方式爆炸。

这意味着您的某些表包含重复的行,即对于此 account_id 和日期组合,它们返回不止一行。

换句话说:不强制执行主键。

关于mysql - 如何正确构建这个查询?这是一个合适的 MySql 方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39729410/

相关文章:

sql - Oracle 查询不返回空值

php - 在 PDO 准备语句中使用 LAST_INSERT_ID 插入多个表

mysql - 我可以在我的机器上免费使用 MySql 来开发我的应用程序吗?

sql - 如何在 SQL where 子句中执行条件语句

sql - Postgres 大于或空

mysql - 限制起始值如何来自mysql中的其他表

mysql - 如何检查答案的作者与问题的作者是否相同?

Mysql分区列(日期)执行计划

php - 使用 PHP PDO 扩展删除 MySQL 数据库中的多行

mysql - 我读到的关于 "that bad"的一致性/数据丢失/查询优化问题是什么?