搜尋

首頁  >  問答  >  主體

限制條件下使用內連接從兩個表中選擇

我有兩個表格 ServiceStatus。服務表只保存一個name和一個id

#
| id |  name |
|----|-------|
|  1 | Test1 |
|  2 | Test2 |

還有一個像這樣的狀態表

| id | status | service_id |                 timestamp |
|----|--------|------------|---------------------------|
|  1 |     OK |          1 | October, 15 2015 09:03:07 |
|  2 |     OK |          1 | October, 15 2015 09:08:07 |
|  3 |     OK |          2 | October, 15 2015 10:05:23 |
|  4 |     OK |          2 | October, 15 2015 10:15:23 |

我想取得這樣的資料

| id |  name | status |                 timestamp |
|----|-------|--------|---------------------------|
|  1 | Test1 |     OK | October, 15 2015 09:08:07 |
|  2 | Test2 |     OK | October, 15 2015 10:15:23 |

帶有服務資料的最新狀態。我已經嘗試過這個說法

SELECT ser.id, ser.name, a.status, a.timestamp
from Service ser
  inner join (select * from status
              order by Status.timestamp
              DESC limit 1) as a
    on a.service_id = ser.id

但我只得到

| id |  name | status |                 timestamp |
|----|-------|--------|---------------------------|
|  2 | Test2 |     OK | October, 15 2015 10:15:23 |

如何更改語句以獲得我想要%

P粉393030917P粉393030917243 天前331

全部回覆(2)我來回復

  • P粉312631645

    P粉3126316452024-03-27 15:56:09

    對於每項服務,僅在不存在後續服務時才使用 NOT EXISTS 傳回狀態:

    select ser.id, ser.name, st.status, st.timestamp
    from service ser
      left join status st1 on ser.id = st1.service_id
    where not exists (select 1 from status st2
                      where st2.service_id = st1.service_id
                        and st2.timestamp > st1.timestamp)

    可以選擇執行LEFT JOIN來傳回沒有任何狀態的服務。如果不需要,請切換到 JOIN

    回覆
    0
  • P粉340264283

    P粉3402642832024-03-27 13:55:48

    你可以這樣做:

    SELECT 
      ser.id, 
      ser.name, 
      s.status, 
      s.timestamp 
    FROM Service ser 
    INNER JOIN status as s ON s.service_id = ser.id
    INNER JOIN
    (
       SELECT
         service_id, 
         MAX(timestamp) AS MaxDate
       FROM status 
       GROUP BY service_id
    ) AS a  ON a.service_id = s.service_id 
           AND a.MaxDate = s.timestamp;

    與子查詢的連接:

    SELECT
      service_id, 
      MAX(timestamp) AS MaxDate
    FROM status 
    GROUP BY service_id

    將消除除最新日期之外的所有狀態。

    回覆
    0
  • 取消回覆