将3个MySQL表合并到合并表中会导致太多结果

时间:2015-03-01 14:16:01

标签: mysql sql database multi-table consolidation

我有3个表:成员,产品,product_costs

我需要将这些表中的信息合并到一个表中。当我这样做时,我得到了太多结果,我不知道为什么。

对于每种产品,应该有成本,但可能没有。如果有产品但没有成本,我希望它在这些列中抛出空值或零。

以下是表结构:

会员表

member_id       first_name      last_name

产品表

product_id      member_id       product_date

产品成本表

product_cost_id     member_id       product_cost_amount

以下是我在统一表格中寻找的内容:

合并表结构

member_id       first_name      last_name       product_id      product_date        product_cost_amount

为了达到目的,我写了以下查询:

    SELECT
        M.member_id,
        M.first_name,
        M.last_name,
        P.product_id,
        P.product_date,
        PC.product_cost_amount
    FROM
        members AS M
        INNER JOIN products AS P ON P.member_id = M.member_id
        INNER JOIN product_costs AS PC ON PC.member_id = M.member_id

这将返回我想要的所有列,这不是问题。假设我在成员表中有一个成员的1条记录,我有5个产品用于该成员,这也有5个成本。当我运行此查询时,我得到25个结果,我不知道为什么。我预计总共有5个结果,每个成员选择产品1行,会员详细信息和成本。我得到的是每个产品1行,重复同一产品的5行成本。

问题似乎是INNER JOIN product_costs AS PC ON PC.member_id = M.member_id,但我尝试使用不同的联接类型运行,但我仍然没有看到正确的结果,如果没有该行,我怎么连接成本,因为那没有直接的关系?我在纸上勾画了这个图表,但我还是不明白我做错了什么。我已经构建了一个较小的测试数据库来简化和再次尝试使用100%干净的数据并且仍然是相同的结果(这来自的实际数据库是巨大的,查询量大,所以我在这里简化了它隔离结果并使其更容易使用)。

任何人都可以帮助我理解为什么这个加入不起作用?可能是成本与产品本身之间没有直接关系吗?如果是这样,我并不反对直接连接这两者,因为从技术上来说,总是应该付出代价,即使这个成本在技术上是免费的。我只是继承了这个数据库设计,并且假设他们仍然通过member_id与成员联系在一起,我不明白为什么会这样。

提前感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:2)

join表格product_costs上的products条件丢失了:

FROM members M INNER JOIN
     products P
     ON P.member_id = M.member_id INNER JOIN
     product_costs PC
     ON PC.member_id = M.member_id AND
        PC.product_id = P.product_id