Memilih daripada dua jadual menggunakan cantuman dalam dengan kekangan
P粉393030917
P粉393030917 2024-03-26 18:57:43
0
2
352

Saya ada dua meja ServiceStatus。服务表只保存一个name和一个id

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

Ada juga jadual status seperti ini

| 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 |

Saya ingin mendapatkan data sedemikian

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

Status terkini dengan data perkhidmatan. Saya telah mencuba kenyataan ini

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

Tetapi yang saya dapat hanyalah

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

Bagaimana saya menukar penyata untuk mendapatkan apa yang saya mahukan?

Untuk menguji SQL Fiddle

P粉393030917
P粉393030917

membalas semua(2)
P粉312631645

Untuk setiap perkhidmatan, hanya digunakan jika tiada perkhidmatan berikutnya wujud NOT EXISTS Status pemulangan:

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)

Anda boleh memilih untuk melaksanakanLEFT JOIN来返回没有任何状态的服务。如果不需要,请切换到 JOIN.

P粉340264283

Anda boleh melakukan ini:

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;

Sertai dengan subquery:

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

Akan menghapuskan semua status kecuali tarikh terkini.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan