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

Pilih semua tempat bidang berisi string yang dipisahkan dengan koma

Dengan MySQL, Anda dapat menggunakan FIND_IN_SET() :

SELECT * FROM mytable WHERE FIND_IN_SET('ios ', tags) > 0;

http://dev.mysql .com/doc/refman/5.0/en/string-functions.html#function_find-in-set

Perhatikan bahwa FIND_IN_SET mengharapkan string menjadi koma dipisahkan, bukan koma dan spasi terpisah. Jadi Anda mungkin memiliki masalah dengan tag terakhir. Cara terbaik adalah menormalkan tabel; jika tidak, Anda dapat menghapus spasi dari tags kolom; akhirnya Anda dapat mengatasi masalah dengan menambahkan spasi ke tags kolom:

SELECT * FROM mytable WHERE FIND_IN_SET('ios ', CONCAT(tags,' ')) > 0;

Jika jumlah tag terbatas, Anda dapat mempertimbangkan untuk mengonversi kolom menjadi SET . Ini akan sangat meningkatkan efisiensi.

PERBARUI

Kecuali bahwa saya mendapatkan spasi salah . Mereka sebelum string dan bukan setelahnya.

Jadi:

SELECT * FROM mytable WHERE FIND_IN_SET(' ios', CONCAT(' ', tags)) > 0;

Tapi sekali lagi, singkirkan ruang-ruang itu - itu hanyalah masalah :-)

PERBARUI 2

Di atas berfungsi, oke. Tapi, itu hampir semua yang bisa Anda katakan untuk saya. Tidak hanya solusinya yang cukup *in*efisien, itu juga membuat sistem di sebelah tidak dapat dipertahankan (sudah ada, melakukan itu, mendapatkan T-Shirt dan pantat yang dikunyah di bawahnya sama). Jadi sekarang saya akan sedikit mendukung normalisasi, yaitu, memiliki setidaknya dua tabel ini lagi:

CREATE TABLE tags ( id      INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
                    tagName varchar(32) // I'm a bit of a cheapskate
);
CREATE TABLE has_tag ( tableid INTEGER, tagid INTEGER );

Berapa ini lebih baik? Biarkan saya menghitung jalannya.

  • Anda dapat dengan mudah menambahkan kueri yang lebih fleksibel ("memiliki semua tag di iOS, C++, ..." atau "memiliki setidaknya tiga tag di antaranya:( iOS, Python, SQL, .NET, Haskell )". Ya, Anda dapat melakukannya dengan FIND_IN_SET , tapi percayalah, Anda tidak akan menikmatinya .
  • Anda memiliki kamus terkontrol tag, yang memungkinkan Anda untuk memeriksa apakah ada tag yang diketahui (serta membuat daftar dengan mudah seperti kotak kombo drop-down, atau -- apakah ada yang mengatakan 'jQuery Autocomplete'?).
  • menyimpan beberapa real estat disk (tag ditulis satu kali)
  • penelusuran cepat . Jika Anda sudah mengetahui tag yang Anda cari dan mengompilasinya terlebih dahulu ke dalam ID tag, tag tersebut akan meninggalkan bekas gosong karet SQL di trotoar saat dijalankan (pencarian yang diindeks untuk bilangan bulat nilai!). Dan tag yang tidak dapat dikompilasi tidak akan ada , dan Anda akan mengetahuinya bahkan sebelum pencarian dimulai.
  • memudahkan mengganti nama tag
  • bisa menampung nomor apa saja tag (Anda berisiko memiliki beberapa tag yang terpotong menjadi 'iOS Development' cepat atau lambat...)

Saya percaya bahwa "bidang CSV" disensor di antara SQL Antipatterns ( http://pragprog.com/book/bksqla/sql-antipatterns ), dan untuk alasan yang bagus.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pilih 5 baris terbaru berdasarkan tanggal

  2. Hitungan Bersyarat MySQL

  3. Bagaimana cara menggunakan koneksi yang sama untuk dua kueri di Musim Semi?

  4. Ada simbol seperti  dan sebagainya di database, apa yang harus dilakukan?

  5. Permintaan SQL LIKE gagal - kesalahan fatal dalam pernyataan yang disiapkan