我用最简单的方式复现一下问题。
1、准备两张基础表t_person_info和t_person_info1
2、遍历今年所经历过的月份
SELECT
*
FROM
(
SELECT
x0.date
FROM
(
SELECT
DATE_FORMAT( DATE_SUB( last_day( CURRENT_DATE ), INTERVAL xc - 1 MONTH ), '%Y-%m' ) AS date
FROM
(
SELECT
@xi := @xi + 1 AS xc
FROM
( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 ) xc1,
( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 ) xc2,
( SELECT @xi := 0 ) xc0
) xcxc
) x0
WHERE
x0.date >= (IF(MONTH(CURRENT_DATE)!=1,CONCAT(YEAR(CURRENT_DATE),'-01'),CONCAT(YEAR(CURRENT_DATE)-1,'-01')))
ORDER BY
x0.date
) aa
3、将t_person_info、t_person_info1分别与2中的月份做笛卡尔关联,然后将两个结果集用UNION ALL连接。
问题出现了,查询的结果只有第一个结果集的内容。
原因是用UNION ALL关联的两个结果集都用到了遍历的月份列表,而这个列表中用到了变量“@xi”。两个结果集中变量重复,这时候需要将其中一个结果集中的变量名更改,结果才会正常展示。如图:
至此,问题解决。