2017-04-22 48 views
1

返回数据考虑此UNION两个(或更多)的查询:需要像UNION的查询,但在第二的相应列的别名和第n个查询,而不是所述第一查询的列/别名

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天(这就是DATEFIFF部分)DATE_END所有记录,符合指定帐号(JR161167),但在活动场中包含的任何和所有子“1 ñ“。

使用UNION可从单个表“activities”中返回正确的数据,但似乎没有办法在第一个查询的列或别名下标题结果集。相反,我想是这样的:

activity1    status1 date1  activity2 status2   date2 
-------------------------------------------------------------------------------- 
1.1 Step 1 begins... Incomplete 2017-4-16 1.2  Step 2 begins... Incomplete 2017-4-30 

相反,我的查询栈的所有结果,不管是否含有1.1,1.2,1.3,等等,一个别名列标题,activity1下。与日期和完成字段数据相同的东西,它并不会很好地分类到相应的日期1,日期2等或状态1,状态2等。

我最近读了一个看起来像这样的例子,它貌似我要实现的逻辑,我不知道是否有人能理解其意图,并帮助我制定正确的查询:

SELECT date_end 
IF(WHERE description LIKE '1.1 %') AS date1, 
IF(WHERE description LIKE '1.2 %') AS date2` 
FROM activities 

回答

1

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 | 
+0

很不错的!加入,而不是联盟。这是我的项目的关键部分。这绝对有用。 – TARKUS

+1

@TARKUS欢迎您,我已经添加了第二种方式来执行查询,加入后就像您应该使用它们一样;) – Blag

+0

您的第二种方式更加易于管理,因为我必须将JOINS X 9(步骤1.1 - 1.9),并循环数千个'事项'或账号。再次,查询正在工作。谢谢! – TARKUS

相关问题