【问题标题】:MySQL - How to perform a multiple join query?MySQL - 如何执行多重连接查询?
【发布时间】:2015-08-30 08:34:36
【问题描述】:

我正在尝试连接两个表,但问题是收银员表可以与销售表中的 3 个字段连接,如果我只用一个字段连接两个表,我不想错过任何记录。我只想获得与收银员表一样多的行。我希望这是有道理的。这是我正在尝试做的一个例子。

SELECT cashiers.cashierId,cashiers.name,cashiers.age, 
(SELECT
(SELECT SUM(amount) * .20 FROM sales WHERE cashierId1 = cashiers.cashierId) + 
(SELECT SUM(amount) * .30 FROM sales WHERE cashierId2 = cashiers.cashierId) +
(SELECT SUM(amount) * .40 FROM sales WHERE cashierId3 = cashiers.cashierId)
) AS totalAmount
FROM cashiers

感谢大家的帮助。

【问题讨论】:

  • 样本数据确实有助于阐明您在做什么。
  • 您可以同时加入多个字段。 select * from table1 a inner join table2 b on a.column1 = b.column1 and a.col2 = b.col2
  • 每笔销售是否只计入一名收银员?
  • 许多cashierID 列很可能是糟糕的设计。 (因此导致查询和表谓词不必要的复杂性。)只需有一个 cashierID 列和记录行,其中“cashierID 确实销售 saleID AND ...”。我们必须猜测,直到您为当前表提供这样的谓词。例如“sale saleID ... AND(没有收银员这样做并且 cashierID1cashierID2cashierID3 为 NULL 或只有 cashierID1 做到了并且 cashierID2cashierID3 为 NULL 或只有 cashierID1cashierID2做到了,cashierID3 为 NULL 或只有 cashierID1cashierID2 和 cashierIDI3* 做到了)并且 ..."。

标签: mysql sql database join


【解决方案1】:

我认为 Gordon 的回答可能不错,但我认为它也假设只有一名收银员会匹配。您可能一直在想像这样的事情:

select
    c.cashierid, min(c.name) as name, min(c.age) as age,
    sum(s1.amount * 0.2) + sum(s2.amount * 0.3) + sum(s3.amount * 0.4)
from
    cashiers c
    left outer join sales s1 on s1.cashierid1 = c.cashierid
    left outer join sales s2 on s2.cashierid2 = c.cashierid
    left outer join sales s3 on s3.cashierid3 = c.cashierid
group by
    c.cashierId

【讨论】:

    【解决方案2】:

    也许这就是你想要做的:

    SELECT c.cashierId, c.name, c.age, 
           (SELECT SUM(CASE c.cashierId WHEN s.cashierId1 THEN 0.2 * s.amount
                                        WHEN s.cashierId2 THEN 0.3 * s.amount
                                        WHEN s.cashierId3 THEN 0.4 * s.amount
                       END)
            FROM sales
            WHERE c.cashierId IN (s.cashierId1, s.cashierId2, s.cashierId3)
           ) AS totalAmount
    FROM cashiers c;
    

    【讨论】:

    • 您需要求和中的case。我认为那只是一个意外。
    • @shawnt00 。 . .谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多