考虑两个(或更多)查询的 UNION:
SELECT activity AS activity1, completion AS status1, date_end AS date1
FROM activities
WHERE (
matter LIKE '%JR161167'
AND activity LIKE '1.1 %'
AND DATEDIFF( CURDATE( ) , date_end ) <120
)
UNION
SELECT activity AS activity2, completion AS status2, date_end AS date2
FROM activities
WHERE (
matter LIKE '%JR161167'
AND activity LIKE '1.2 %'
AND DATEDIFF( CURDATE( ) , date_end ) <120
)
事件列将包含一个可变字符串值,但该字符串将始终以 1.1
或 1.2
或 1.3
可靠地作为前缀到 1.9
。
事务列也是一个字符串,但会可靠地附加一个类似于 JR161167
的帐号。
我想查询过去 120 天内所有具有 date_end 的记录(即 DATEFIFF
部分),匹配指定的帐号 (JR161167),但事件字段包含任何和所有子字符串“1.n”。
使用 UNION 从单个表“事件”返回正确的数据,但似乎没有办法将结果集置于第一个查询的列或别名下。相反,我想要这样的东西:
activity1 status1 date1 activity2 status2 date2
--------------------------------------------------------------------------------
1.1 Step 1 begins... Incomplete 2017-4-16 1.2 Step 2 begins... Incomplete 2017-4-30
相反,我的查询在一个别名列标题 activity1
下堆叠所有结果,无论它们是否包含 1.1、1.2、1.3 等。与日期和完成字段数据相同,它不会很好地排序到相应的 date1、date2 等,或 status1、status2 等。
我最近读到一个例子,看起来像这样,它看起来像我想要实现的逻辑,我想知道是否有人能理解它的意图并帮助我制定正确的查询:
SELECT date_end
IF( WHERE description LIKE '1.1 %') AS date1,
IF( WHERE description LIKE '1.2 %') AS date2`
FROM activities
最佳答案
查询 1:
SELECT a1.*, a2.*
FROM (
SELECT matter, activity, completion, date_end
FROM activities
WHERE
matter LIKE '%JR16116'
AND activity = '1.1'
AND DATEDIFF(CURDATE(), date_end) <120
) a1
JOIN (
SELECT matter, activity, completion, date_end
FROM activities
WHERE
matter LIKE '%JR16116'
AND activity = '1.2'
AND DATEDIFF(CURDATE(), date_end) <120
) a2
ON a1.matter = a2.matter
Results :
| matter | activity | completion | date_end | matter | activity | completion | date_end |
|---------|----------|------------|------------|---------|----------|------------|------------|
| JR16116 | 1.1 | 1 | 2017-04-22 | JR16116 | 1.2 | 1 | 2017-04-23 |
查询 2:
-- other way without sub request but clean join
SELECT
a.matter, a.activity, a.completion, a.date_end
,a2.activity, a2.completion, a2.date_end
-- ,a3.activity, a3.completion, a3.date_end
FROM activities a
JOIN activities a2
ON (
a.matter = a2.matter
AND a2.activity = '1.2'
AND DATEDIFF(CURDATE(), a2.date_end) <120
)
-- JOIN activities a3
-- ON (
-- a.matter = a3.matter
-- AND a3.activity = '1.3'
-- AND DATEDIFF(CURDATE(), a3.date_end) <120
-- )
WHERE
a.matter LIKE '%JR16116'
AND a.activity = '1.1'
AND DATEDIFF(CURDATE(), a.date_end) <120
Results :
| matter | activity | completion | date_end | activity | completion | date_end |
|---------|----------|------------|------------|----------|------------|------------|
| JR16116 | 1.1 | 1 | 2017-04-22 | 1.2 | 1 | 2017-04-23 |
关于mysql - 需要像 UNION 这样的查询,但返回数据在第 2 个和第 n 个查询的相应列别名中,而不是第一个查询列/别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43559490/