提问者:小点点

如何通过连接两个表并使用示例中的子查询来编写报告货物位置的SQL查询?


我有两张桌子。

表1

ID-ORDER_ID-STATUS_ID-CREATE_DATE

1-4322-100-02.01.2019

2-4322-2-03.01.2019

3-5677-100-05.01.2019

4-4322-3-09.01.2019

5-9987-2-17.01.2019

6-4322-11-02.02.2019

7-5677-3-22.01.2019

表2

STATUS_ID-STATUS_NAME

100-Odeme AliNdi

2-西帕里什哈泽尔兰尼约尔

7-Iptal edildi

3-德波切克什河亚普尔德河

9-Teslim edidi

12-伊迪尔迪

我必须编写一个查询来创建此报告:

ORDER_ID-FIRST_STATUS_NAME-FIRST_STATUS_DATE-LAST_STATUS_NAME-LAST_STATUS_DATE

4322-奥德梅-2019年1月20日-不详-2019年2月20日

5677-奥德梅-2019年1月5日-德波切克-2019年1月22日

9987-西帕里什哈泽尔兰河-2019年1月17日-西帕里什哈泽尔兰河-
2019年1月17日

我知道我必须使用INNER JOIN和sub select查询,但我是一个刚使用SQL的用户,我试图用三天的时间来编写这个查询。 但我做不到。 这是我糟糕的考验。

SELECT ORDER_ID, (SELECT STATUS_NAME FROM Tablo-2 WHERE STATUS_ID.Tablo-1=STATUS_ID.Tablo-2 GROUP BY ORDER_ID HAVING MIN(CREATE_DATE) ) AS FIRST_STATUS_NAME,
 (SELECT CREATE_DATE FROM Tablo-1 WHERE STATUS_ID.Tablo-1=STATUS_ID.Tablo-2 GROUP BY ORDER_ID HAVING MIN(CREATE_DATE) ) AS FIRST_STATUS_DATE, 
(SELECT STATUS_NAME FROM Tablo-2 WHERE STATUS_ID.Tablo-1=STATUS_ID.Tablo-2 GROUP BY ORDER_ID HAVING MAX(CREATE_DATE) ) AS LAST_STATUS_NAME, 
(SELECT CREATE_DATE FROM Tablo-1 WHERE STATUS_ID.Tablo-1=STATUS_ID.Tablo-2 GROUP BY ORDER_ID HAVING MAX(CREATE_DATE) ) AS LAST_STATUS_DATE 
FROM Table1, Table2 ORDER BY CREATE_DATE ASC

SELECT STATUS_NAME FROM table1, table2, 
(SELECT ORDER_ID, STATUS_ID, MIN(CREATE_DATE) AS FIRST_STATUS_DATE, MAX(CREATE_DATE) AS LAST_STATUS_DATE FROM tablo1 GROUP BY ORDER_ID) t  
WHERE table1.STATUS_ID = table2.STATUS_ID 

如果你能帮助我,我会很高兴的。 祝你今天愉快。


共1个答案

匿名用户

对于在任一数据库中工作的版本,可以使用first_value()select distinction:

select distinct t1.order_id,
       first_value(t2.status_name) over (partition by t1.order_id order by t1.create_date) as first_status_name,
       min(t1.create_date) over (partition by t1.order_id) as first_status_date,
       first_value(t2.status_name) over (partition by t1.order_id order by t1.create_date desc) as last_status_name,
       max(t1.create_date) over (partition by t1.order_id) as last_status_date
from table1 t1 join
     table2 t2
     on t2.status_id = t1.status_id;

编辑:

在MySQL的旧版本中,最简单的方法可能是使用group by:

select t1.order_id,
       substring_index(group_concat(t2.status_name order by t1.create_date), ',', 1) as first_status_name,
       min(t1.create_date) as first_status_date,
       substring_index(group_concat(t2.status_name order by t1.create_date desc), ',', 1) as last_status_name,
       max(t1.create_date) s last_status_date
from table1 t1 join
     table2 t2
     on t2.status_id = t1.status_id
group by t1.order_id;

请注意,该版本假定状态描述没有逗号--并且不超过group_concat()的MySQL内部长度限制。 但在大多数情况下是有效的。