Rumah  >  Soal Jawab  >  teks badan

MEMILIH dengan berbilang keadaan WHERE pada lajur yang sama

<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粉384366923P粉384366923423 hari yang lalu388

membalas semua(2)saya akan balas

  • P粉511896716

    P粉5118967162023-08-24 17:05:54

    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

    balas
    0
  • P粉138871485

    P粉1388714852023-08-24 11:10:07

    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.

    balas
    0
  • Batalbalas