mysql - 需要像 UNION 这样的查询,但返回数据在第 2 个和第 n 个查询的相应列别名中,而不是第一个查询列/别名

标签 mysql sql join

考虑两个(或更多)查询的 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.11.21.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

最佳答案

SQL Fiddle

查询 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/

相关文章:

php - MySQL 中的月份查询

sql - 跨多个表的NHibernate查询

Sql Server - 在 where 子句中执行 RTRIM/LTRIM 的替代方法

ms-access - MS Access 2007 JOIN 多个字段

mysql - 如何限制mysql表中可以存储的行数?

mysql - 使用 MySQL 唯一索引来防止重复,而不是重复搜索?

mysql - SQL 在一个连接中更新多行

mysql - 多重连接中使用哪种JOIN类型

jquery - 如何在 Coldfusion 中的复选框更改时更新数据库?

sql - 如何找到数据库中哪一行使用的空间最多?