表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。
答案 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