【问题标题】:How to join two tables in mysql如何在mysql中连接两个表
【发布时间】:2013-09-05 04:39:25
【问题描述】:

我有一个如下所示的income 表:

date              income      
---------------------------
09/05/13          56000    
09/05/13          66600
09/05/13          50000

还有一个如下所示的expense 表:

date              expense 
----------------------------
09/05/13          68800

我想编写一个查询,其输出如下所示:

date              income             expense 
---------------------------------------------
09/05/13          56000              68800
09/05/13          66600
09/05/13          50000

【问题讨论】:

    标签: mysql full-outer-join


    【解决方案1】:

    UPDATE2:如果您不关心收入值与费用值匹配的特定顺序,您可以通过这样的查询获得所需的输出

    SELECT date, 
           MAX(CASE WHEN type = 1 THEN amount END) income,
           MAX(CASE WHEN type = 2 THEN amount END) expense
      FROM
    (
      SELECT 1 type, date, income amount, @n := IF(@g = date, @n + 1, 1) rnum, @g := date g
        FROM income CROSS JOIN (SELECT @n := 0, @g := NULL) i1
       UNION ALL
      SELECT 2, date, expense amount, @m := IF(@f = date, @m + 1, 1) rnum, @f := date g
        FROM expense CROSS JOIN (SELECT @m := 0, @f := NULL) i2
    ) q
     GROUP BY date, rnum
    

    输出:

    |日期 |收入 |费用 | |--------------------|--------|---------| | 2013 年 9 月 5 日 | 56000 | 68800 | | 2013 年 9 月 5 日 | 66600 | (空) | | 2013 年 9 月 5 日 | 50000 | (空) |

    这里是SQLFiddle演示


    UPDATE1:用这样的查询对每天的收入和支出进行分组似乎是合乎逻辑的

    SELECT a.date, i.income, e.expense
      FROM
    (
      SELECT date
        FROM income
      UNION
      SELECT date
        FROM expense 
    ) a LEFT JOIN 
    (
      SELECT date, SUM(income) income
        FROM income
       GROUP BY date
    ) i
        ON a.date = i.date LEFT JOIN 
    (
      SELECT date, SUM(expense) expense
        FROM expense
       GROUP BY date
    ) e
        ON a.date = e.date
    

    输出:

    |日期 |收入 |费用 | |--------------------|--------|---------| | 2013 年 9 月 5 日 | 172600 | 68800 |

    这里是SQLFiddle演示


    原始问题的原始答案:如果您需要FULL OUTER JOIN(超过date 列),如您在原始问题中所述,那么就可以了

    SELECT a.date, i.income, e.expense
      FROM
    (
      SELECT date
        FROM income
      UNION
      SELECT date
        FROM expense 
    ) a LEFT JOIN income i
        ON a.date = i.date LEFT JOIN expense e
        ON a.date = e.date
    

    但是你会得到这个作为输出

    |日期 |收入 |费用 | |---------------|--------|------------| | 05 年 9 月 | 56000 | 68800 | | 05 年 9 月 | 66600 | 68800 | | 05 年 9 月 | 50000 | 68800 |

    这里是SQLFiddle演示

    【讨论】:

    • 费用中有重复条目
    • @FaztrickFazilPv 那是因为您要求完全外部联接。决定使用哪个收入行显示您的一个支出行,反之亦然的确定性规则是什么?
    • @FaztrickFazilPv 那么它不是完全外连接,您需要在上一条评论中回答问题以修复查询。
    • 这个情况使用哪个加入
    • 如何对每天的收入和支出进行分组? sqlfiddle.com/#!2/280dd/4
    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多