Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

KASUS di WHERE CLAUSE di MYSQL

Anda berada di jalur yang benar dengan upaya kedua, menggunakan AND/OR yang logis pengelompokan alih-alih CASE , tetapi jika Anda ingin lebih suka baris yang cocok dengan cmp_brand di atas baris dengan cmp_brand yang kosong dan hanya mengharapkan satu hasil kembali, susun ORDER BY your Anda untuk mengurutkan cmp_brand yang tidak kosong pertama, dan batasi hasil keseluruhan menjadi 1.

SELECT thumb 
FROM inf_brand_images 
WHERE
  is_active=1 AND 
  ((cmp_brand = '' AND brand='NIKE') OR (cmp_brand='123_NIKE'))
/* non-empty cmp_brand will sort first */
ORDER BY cmp_brand <> '' DESC
/* and the end result is limited only to the first sorted row
   which will be the cmp_brand if matched, or the brand otherwise */
LIMIT 1

http://sqlfiddle.com/#!2/d176b/2

Ini berfungsi karena ekspresi cmp_brand <> '' mengevaluasi ke boolean true/false , yang ditafsirkan MySQL sebagai 1/0 . Pengurutan menurun pada nilai tersebut memaksa nilai yang tidak kosong untuk mengurutkan kepalan tangan (1 sebelum 0).

Perbarui setelah komentar:

Karena Anda memiliki kemungkinan lebih dari satu baris dikembalikan, Anda tidak dapat mengandalkan ORDER BY . Sebagai gantinya, Anda dapat melakukan LEFT JOIN terhadap meja yang sama. Di satu sisi, cocokkan cmp_brand = '' dan di sisi lain cocokkan cmp_brand = '123_NIKE' . Yang penting, kembalikan thumb kolom dari keduanya sisi gabungan.

Bungkus itu dalam subquery di FROM klausa, maka di tingkat atas Anda dapat menggunakan SELECT CASE untuk memilih cmp_brand jika tidak kosong.

SELECT DISTINCT
  CASE WHEN cbcb IS NOT NULL THEN cbthumb ELSE bthumb END AS thumb
FROM (
  /* Return thumbs from both sides of the join */
  SELECT 
    b.thumb AS bthumb,
    b.cmp_brand AS bcb,
    cb.thumb AS cbthumb,
    cb.cmp_brand AS cbcb
  FROM
    inf_brand_images b
    /* join the table against itself with the matching cmp_brand in the join condition */
    LEFT JOIN inf_brand_images cb
      ON b.brand = cb.brand
      AND cb.cmp_brand = '123_NIKE'
  WHERE 
    /* The WHERE clause looks for empty cmp_brand on the left side of the join */
    b.brand = 'NIKE' AND b.cmp_brand = ''
) thumbs



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. File .PDF Besar Tidak Mengunggah Ke Database MySQL sebagai BLOB Sedang Melalui PHP, File di bawah 2MB Berfungsi dengan Baik

  2. Dapatkan variabel dalam loop sementara berdasarkan apa yang dipilih pengguna?

  3. mysql memeriksa susunan tabel

  4. Bagaimana cara melampirkan file database mysql

  5. Dapatkan String Kueri MySQL Lengkap saat Sisipkan atau Perbarui