2017-05-19 167 views
-1

我想知道是否我可以留下一個子查詢連接到另一個查詢時,當兩者都涉及到相同的表。左加入一個子查詢到表1到另一個查詢到表1

該查詢會給我第一次預約客戶已完成(QUERY1):

SELECT ID, AN_ID, BUS_ID, DONE_DATE, BV, SET_DATE, REG_DATE 
FROM `TABLE_1` 
RIGHT JOIN `TABLE_2`on (TABLE_1.AN_ID = TABLE2.BEN_ID) 
WHERE ((((TABLE1.AN_ID > 0)) AND (TABLE1.STATUS = 3)) AND (TABLE1.DONE_DATE > 0)) AND TABLE1.BEN_ID <> 41)) 
GROUP BY USER 
ORDER BY TABLE1.DONE_DATE ASC 

這個查詢應該給我第二次預訂的客戶已經做:

SELECT ID, AN_ID, BUS_ID, DONE_DATE, BV, SET_DATE, REG_DATE 
FROM `TABLE_1` 
RIGHT JOIN `TABLE_2`on (TABLE_1.AN_ID = TABLE2.BEN_ID) 
**LEFT JOIN QUERY1** 
WHERE ((((TABLE1.AN_ID > 0)) AND (TABLE1.STATUS = 3)) AND (TABLE1.DONE_DATE > 0)) AND TABLE1.BEN_ID <> 41)) 
    GROUP BY USER 
    ORDER BY TABLE1.DONE_DATE ASC 

我怎麼能做這個?在我的理解中,總體查詢應該給我第二個最低的,因此每個客戶的第二個預訂(即:第一次重新預訂)。爲什麼?:通過「左連接」加入QUERY1,它應該導致我對所有記錄進行全面查詢,但是QUERY1中的查詢或?

我試過'WHERE NOT EXISTS'(顯示我沒有數據)和'WHERE NOT IN'(錯誤約1列出現)。

任何想法?期待您的專業知識!

P.S .:我認爲可能像這樣VIRTUAL TABLE可以幫助,但說實話我的SQL技能不符合在那裏描述的任何東西。 :(

+0

「此查詢會給我第一個客戶完成的預訂(QUERY1):」呃,不會的 - 或者只是偶然/巧合! :-( – Strawberry

+0

請參閱:[爲什麼我應該爲我認爲是非常簡單的SQL查詢提供一個MCVE?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-一個mcve爲什麼似乎對我來說是一個非常簡單的sql查詢) – Strawberry

+0

好吧。如上所述,我不是一個SQL專業人員。如果您需要一些更多的信息,以便您可以幫助我 - 請詳細說明這些問題,並且我很樂意提供這些信息。從我所瞭解的SQL來看,這是目前所有必需的信息。在我對QUERY1的理解中,由於我通過DONE_DATE ASC和USERS命令進行了排序,我是每個用戶的最低DONE_DATE結果? –

回答

0

只是爲了說明草莓的觀點

DROP TABLE IF EXISTS T; 
CREATE TABLE T (ID INT, DT DATE); 
INSERT INTO T VALUES 
(1,'2017-10-01'),(1,'2016-01-01'), 
(2,'2017-01-02'),(2,'2017-01-01'); 

SELECT ID, DT 
FROM T 
GROUP BY ID 
ORDER BY DT ASC 

+------+------------+ 
| ID | DT   | 
+------+------------+ 
| 2 | 2017-01-02 | 
| 1 | 2017-10-01 | 
+------+------------+ 
2 rows in set (0.00 sec) 

在沒有情況的最早日期檢測。如果你想找到,如果你需要,你應使用MIN

SELECT ID, min(DT) FirstBooking 
FROM T 
GROUP BY ID 
ORDER BY id 

+------+--------------+ 
| ID | FirstBooking | 
+------+--------------+ 
| 1 | 2016-01-01 | 
| 2 | 2017-01-01 | 
+------+--------------+ 
2 rows in set (0.00 sec) 

的最早日期找到第一個和第二個然後行號仿真可能是你想要的。

select id,dt,rownumber 
from 
(
SELECT ID, DT 
     ,if(id<>@p,@rn:=1,@rn:[email protected]+1) Rownumber 
     ,@p:=id 
FROM T, (select @rn:=0,@p:=0) rn 
ORDER BY id,dt 
) s 
where rownumber in (1,2) 

+------+------------+-----------+ 
| id | dt   | rownumber | 
+------+------------+-----------+ 
| 1 | 2016-01-01 |   1 | 
| 1 | 2017-10-01 |   2 | 
| 2 | 2017-01-01 |   1 | 
| 2 | 2017-01-02 |   2 | 
+------+------------+-----------+ 
4 rows in set (0.00 sec) 
+0

謝謝。我會盡力瞭解如何將這個應用於我的確切查詢,但一般邏輯似乎有意義。 –

0

這個是我在最後實施的解決方案:

SELECT ID, AN_ID, BUS_ID, DONE_DATE, BV, SET_DATE, REG_DATE 
    FROM TABLE_1 
    JOIN 
    (
    SELECT AN_ID, MIN(DONE_DATE) 
    FROM TABLE_1 
    WHERE AN_ID >0 
    AND DONE_DATE >0 
    AND BEN_ID !=41385 
    GROUP BY AN_ID 
    ) tt ON tt.DONE_DATE = TABLE1.DONE_DATE AND tt.AN_ID = TABLE1.AN_ID 
    JOIN `TABLE_2`on (TABLE_1.AN_ID = TABLE2.BEN_ID)