Kembalikan baris hanya jika nilai tidak wujud
P粉043470158
P粉043470158 2023-08-24 22:07:48
0
2
378
<p>Saya ada 2 jadual - <kod>Tempahan</kod>: </p> <pre class="brush:php;toolbar:false;">id | ----+------------------ 1 | 2|nilai 3 |. nilai</pra> <p>Jadual kedua - <kod>log_tempahan</kod>: </p> <pre class="brush:php;toolbar:false;">id reservation_id | ----+----------------+------------- 1 |. 1 | 2 |. 2 | 3 |. 3 | 4 |. 1 | 5 |. 2 |. <p>Saya hanya perlu memilih tempahan yang tidak dibatalkan (hanya ID 3 dalam kes ini). Saya boleh memilih "Batal" dengan mudah menggunakan syarat <kod>WHERE change_type = cancel</code> tetapi saya sukar memilih "Jangan batalkan" kerana <kod>WHERE</code> 't bekerja di sini kesan. </p >
P粉043470158
P粉043470158

membalas semua(2)
P粉596161915

Demi kesempurnaan (dan saya sangat percaya ia lebih sesuai), saya menggalakkan anda menggunakan yang mudah NOT EXISTS.

SELECT * FROM reservation R
WHERE NOT EXISTS (
  SELECT 1 FROM reservation_log
  WHERE reservation_id = R.id
    AND change_type = 'cancel'
);
P粉692052513
SELECT *
FROM reservation
WHERE id NOT IN (select reservation_id
                 FROM reservation_log
                 WHERE change_type = 'cancel')

atau:

SELECT r.*
FROM reservation r
LEFT JOIN reservation_log l ON r.id = l.reservation_id AND l.change_type = 'cancel'
WHERE l.id IS NULL

Versi pertama lebih intuitif, tetapi saya fikir anda secara umumnya akan mendapat prestasi yang lebih baik dengan versi kedua (dengan mengandaikan anda mempunyai indeks pada lajur yang digunakan dalam gabungan).

Versi kedua berfungsi kerana LEFT JOIN mengembalikan satu baris untuk semua baris dalam jadual pertama. Apabila ON 条件成功时,这些行将包含第二个表中的列,就像 INNER JOIN 一样。当条件失败时,返回的行将包含第二个表中所有列的 NULL。然后,WHERE l.id IS NULL ujian memadankan baris ini, jadi ia menemui semua baris yang tidak sepadan antara jadual.

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