需求:根据主键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)最近消费时间, 这样得到的才是所要的该顾客最近消费记录。

结果如下:

更多相关文章

  1. Java se之静态代码块、代码块、构造函数执行顺序问题
  2. Java普通代码块,构造代码块,静态代码块区别,执行顺序的代码实例
  3. 通过不在android游标中工作的顺序
  4. Android Robotium如何管理测试用例的执行顺序?
  5. Java类的初始化顺序
  6. 《算法导论的Java实现》 10 中位数和顺序统计学

随机推荐

  1. TP-link 无线路由器WDS设置方法图解_无线
  2. 如何在刀片服务器的foreach循环中插入表
  3. 真人演示乳房按摩法 咪咪大而不垂
  4. 如何在动态创建的HTML标签内容中避免单引
  5. HTML+CSS实现审核流程步骤效果
  6. 使用下一个div中的文本设置“下一个”按
  7. 关注“飞翔的键盘” 近期PlayBook/QNX开
  8. Checkbox CSS帮助或IE6黑客攻击
  9. 更改在表Django中选择了其中一个按钮时显
  10. 关于谱聚类spectral clustering转载自htt