MySQL A左连接B表Group BY A.id但是由B.id命令

时间:2015-11-26 13:58:05

标签: mysql

表A

id(UNIQUE)  name
   1       tomato
   2       potato

表B

id  AID   buy_date   buy_money
 6   1   2015-01-01    100
 7   1   2015-02-02    200

我想选择所有使用名称过滤的A记录,并使用最新的buy_date和buy_money:

A.id  A.name  B.buy_date  B.buy_money
 1    tomato  2015-02-02     200
 2    potato     NULL        NULL

如何编写SQL脚本?我试过了:

select A.id, A.name, MAX(B.buy_date)
from A left join B on A.id = B.AID
where A.name like '%to%'
Group by A.id

但这只能获得正确的buy_date,但没有buy_money。

2 个答案:

答案 0 :(得分:0)

http://sqlfiddle.com/#!9/bee19b/1

ImageViewController

答案 1 :(得分:0)

这里有两种基本方法。

首先,如果购买日期对于AID是唯一的,那么您可以使用子查询获取每个AID的最新buy_date,并将其与B表连接以获得其余详细信息。

这方面的缺点是,如果有一个具有相同buy_date的AID的多条记录,您将获得多条记录

SELECT A.id, A.name, B.buy_date, B.buy_money
FROM A 
LEFT OUTER JOIN 
(
    SELECT AID, MAX(buy_date) AS max_buy_date
    FROM B
    GROUP BY AID
) AS sub_B 
ON A.id = sub_B.AID
LEFT OUTER JOIN B
ON B.AID = sub_B.AID
AND B.buy_date = sub_B.max_buy_date
WHERE A.name like '%to%'

第二个解决方案是使用GROUP_CONCAT获取所有值,按buy_date降序排序,然后使用SUBSTRING_INDEX将所有值都提取到第一个分隔符。 GROUP_CONCAT的默认分隔符是逗号,但如果您的值可能包含逗号,则可以轻松更改它。这方面的缺点是它迫使日期和货币字段转换为字符串。

SELECT A.id, 
        A.name, 
        SUBSTRING_INDEX(GROUP_CONCAT(B.buy_date ORDER BY B.buy_date DESC), ',', 1),
        SUBSTRING_INDEX(GROUP_CONCAT(B.buy_money ORDER BY B.buy_date DESC), ',', 1)
FROM A 
LEFT OUTER JOIN B
ON B.AID = A.id
WHERE A.name like '%to%'
GROUP BY A.id, A.name