MySQL多表查询之GroupBy
16lz
2021-01-22
需求:根据主键id查询到该顾客最近的一次消费记录
SQL代码如下:
SELECT
cbi.id,
cbi.mob,
cbi.identity_card,
bcil.remark,
bcil.orders_no,
bcil.brand_no,
bcil.with_date,
bcil.score
FROM
customer_base_info cbi
LEFT JOIN(
SELECT
A.customer_id,
A.with_date,
A.remark,
A.orders_no,
A.brand_no,
A.score
FROM
brand_customer_integral_log A,
(
SELECT
customer_id,
MAX(with_date)max_with_date
FROM
brand_customer_integral_log
GROUP BY
customer_id
)B
WHERE
A.customer_id = B.customer_id
AND A.with_date = B.max_with_date
) bcil ON (bcil.customer_id = cbi.id)
WHERE
cbi.id = '2c914df34997e204014997e2fe4e0001'
用到的两张表:customer_base_info表为顾客基本信息,brand_customer_integral_log顾客消费记录表。
一个顾客对应多个消费记录, 即一对N的。所以用customer_base_info去左连接。我第一反映也是和很多人一样直接左连接brand_customer_integral_log然后取ORDER BY(消费时间),最后根据customer_id来GROUP BY。 但结果是不对的。
这是因为MySQL:
写的顺序:select ... from... where.... group by... having... order by..
执行顺序:from... where...group by... having.... select ... order by...
在ORDER By之前结果就已经SELECT出来了, 所以这样的思路得到的结果是错误的。
选用子查询来解决这个问题:
SELECT
A.customer_id,
A.with_date,
A.remark,
A.orders_no,
A.brand_no,
A.score
FROM
brand_customer_integral_log A,
(
SELECT
customer_id,
MAX(with_date)max_with_date
FROM
brand_customer_integral_log
GROUP BY
customer_id
)B
WHERE
A.customer_id = B.customer_id
AND A.with_date = B.max_with_date
把brand_customer_integral_log内连接, 根据customer_id查询出MAX(with_date)最近消费时间, 这样得到的才是所要的该顾客最近消费记录。
结果如下:
更多相关文章
- Java se之静态代码块、代码块、构造函数执行顺序问题
- Java普通代码块,构造代码块,静态代码块区别,执行顺序的代码实例
- 通过不在android游标中工作的顺序
- Android Robotium如何管理测试用例的执行顺序?
- Java类的初始化顺序
- 《算法导论的Java实现》 10 中位数和顺序统计学