MySQL多表查询之GroupBy

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

  

  结果如下:

  MySQL多表查询之GroupBy_第1张图片

  

你可能感兴趣的:(MySQL)