左连接上的MySQL查询问题

时间:2013-08-02 05:46:48

标签: php mysql sql

我试图从2个表中获得每月的总金额这是我的查询

SELECT date_format(items.date, '%M %Y') as month, 
COALESCE(SUM(items.amount), 0) as Rreceived, 
COALESCE(SUM(issued_items.amount), 0) as Issued, 
items.currency 
FROM items 
LEFT JOIN issued_items 
ON date_format(items.date, '%Y-%m')=date_format(issued_items.date, '%Y-%m') 
AND items.currency=issued_items.currency 
GROUP BY date_format(items.date, '%Y-%m')

我收到的金额错了。你能帮我纠正一下这个问题。

SQL FIFFLE

3 个答案:

答案 0 :(得分:2)

试试这个:

SELECT date_format(items.date, '%M %Y') as month, 
COALESCE(SUM(items.amount), 0) as Rreceived, 

  (SELECT SUM(amount)
  FROM issued_items
  WHERE date_format(items.date, '%Y-%m') = date_format(date, '%Y-%m') 
    AND items.currency = currency 
  ) AS Issued

FROM items
GROUP BY date_format(items.date, '%Y-%m')

答案 1 :(得分:1)

@Stephen: 您的解决方案在 items 上的每一行的 issue_items 上发出子查询,不是吗?

我认为这可能是一个更便宜的解决方案:

SELECT items.month, 
items.amount as Rreceived, 
issued_items.amount as Issued, 
items.currency 
FROM ( 

SELECT date_format(items.date, '%M %Y') as month, 
COALESCE(SUM(items.amount), 0) as amount, 
items.currency 
FROM items  
GROUP BY date_format(items.date, '%Y-%m')
) items 
LEFT JOIN (
SELECT date_format(issued_items.date, '%M %Y') as month, 

  COALESCE(SUM(issued_items.amount), 0) as amount, 
issued_items.currency 
FROM issued_items
  GROUP BY date_format(issued_items.date, '%Y-%m')

)
issued_items 
ON items.month=issued_items.month 
AND items.currency=issued_items.currency 

更改 IFNULL可以解决您的问题(如Oracle中的NVL)

SELECT items.month, 
ifnull(items.amount,0) as Rreceived, 
ifnull(issued_items.amount,0) as Issued, 
items.currency 
FROM ( 

SELECT date_format(items.date, '%M %Y') as month, 
COALESCE(SUM(items.amount), 0) as amount, 
items.currency 
FROM items  
GROUP BY date_format(items.date, '%Y-%m')
) items 
LEFT JOIN (
SELECT date_format(issued_items.date, '%M %Y') as month, 

  COALESCE(SUM(issued_items.amount), 0) as amount, 
issued_items.currency 
FROM issued_items
  GROUP BY date_format(issued_items.date, '%Y-%m')

)
issued_items 
ON items.month=issued_items.month 
AND items.currency=issued_items.currency 

答案 2 :(得分:1)

添加与新http://sqlfiddle.com/#!2/9856e9/1情况相关的新答案:

为了避免排亏,我在两个表上选择了所有可能的月/货币组合,因此我可以在两个表上进行左联接。 请注意,如果工会中没有组合(2013年4月/美元),则不返回任何行!

SELECT union_items.month, 
ifnull(items.amount,0) as Received, 
ifnull(issued_items.amount,0) as Issued, 
union_items.currency 
FROM ( 
      select 
      date_format(items.date, '%M %Y') as month, items.currency 
      FROM items  
      GROUP BY date_format(items.date, '%Y-%m')
      UNION 
      select 
      date_format(issued_items.date, '%M %Y') as month, issued_items.currency 
      FROM issued_items  
      GROUP BY date_format(issued_items.date, '%Y-%m')
) union_items
LEFT JOIN
(
SELECT date_format(items.date, '%M %Y') as month, 
COALESCE(SUM(items.amount), 0) as amount, 
items.currency 
FROM items  
GROUP BY date_format(items.date, '%Y-%m')
) items 
ON items.month=union_items.month 
AND items.currency=union_items.currency 
LEFT JOIN (
SELECT date_format(issued_items.date, '%M %Y') as month, 

  COALESCE(SUM(issued_items.amount), 0) as amount, 
issued_items.currency 
FROM issued_items
  GROUP BY date_format(issued_items.date, '%Y-%m')

)
issued_items 
ON union_items.month=issued_items.month 
AND union_items.currency=issued_items.currency