2017-05-19 43 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)