MEMILIH dengan berbilang keadaan WHERE pada lajur yang sama
P粉384366923
P粉384366923 2023-08-23 19:08:16
0
2
443
<p>Baiklah, saya rasa saya mungkin terlepas pandang sesuatu yang jelas/mudah di sini... tetapi saya perlu menulis pertanyaan yang hanya mengembalikan rekod yang sepadan dengan berbilang kriteria pada lajur yang sama... </ p> <p>Jadual saya ialah persediaan pautan yang sangat mudah untuk menggunakan bendera kepada pengguna...</p> <pre class="brush:php;toolbar:false;">ID contactid flag flag_type ---------------------------------- 118 99 Sukarelawan 1 119 99 Dimuat naik 2 120 100 Melalui Import 3 121 100 Sukarelawan 1 122 100 Dimuat naik 2</pre> <p>Tunggu... Dalam kes ini, anda akan melihat bahawa kenalan 99 dan 100 kedua-duanya ditandakan sebagai "Sukarelawan" dan "Dimuat naik"...</p> <p>Apa yang perlu saya lakukan ialah mengembalikan contactid yang sepadan dengan berbilang kriteria yang dimasukkan melalui borang carian... contactid mesti sepadan dengan semua bendera yang dipilih... Dalam kepala saya, SQL sepatutnya kelihatan seperti: < ; </p> <pre class="brush:php;toolbar:false;">SELECT contactid WHERE bendera = 'Sukarelawan' DAN bendera = 'Dimuat naik'...</pre> <p>Tetapi...tiada apa yang dikembalikan...apa salah saya di sini? </p>
P粉384366923
P粉384366923

membalas semua(2)
P粉511896716

Penggunaan:

SELECT t.contactid
    FROM YOUR_TABLE t
   WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
  HAVING COUNT(DISTINCT t.flag) = 2

Kuncinya ialah bilangan hujah dalam klausa t.flag 的计数需要等于 IN.

Gunakan COUNT(DISTINCT t.flag) sekiranya gabungan contactid dan bendera tidak mempunyai kekangan unik - jika tiada peluang untuk penduaan, anda boleh menghilangkan DISTINCT daripada pertanyaan:

SELECT t.contactid
    FROM YOUR_TABLE t
   WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
  HAVING COUNT(t.flag) = 2
P粉138871485

Anda boleh menggunakan GROUP BYHAVING COUNT(*) = _:

SELECT contact_id
FROM your_table
WHERE flag IN ('Volunteer', 'Uploaded', ...)
GROUP BY contact_id
HAVING COUNT(*) = 2 -- // must match number in the WHERE flag IN (...) list

(dengan andaian contact_id, flag adalah unik).

Atau gunakan pautan:

SELECT T1.contact_id
FROM your_table T1
JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded'
-- // more joins if necessary
WHERE T1.flag = 'Volunteer'

Jika senarai bendera panjang dan banyak perlawanan, yang pertama mungkin lebih pantas. Jika senarai bendera pendek dan terdapat beberapa perlawanan, anda mungkin mendapati yang kedua lebih pantas. Jika prestasi adalah masalah, cuba uji pada data anda untuk melihat yang mana satu berfungsi paling baik.

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