2017-04-22 49 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

相關問題