Saya memiliki bidang COLORS (varchar(50))
dalam tabel saya SHIRTS
yang berisi string yang dipisahkan koma seperti 1,2,5,12,15,
. Setiap angka mewakili warna yang tersedia.
Saat menjalankan query select * from shirts where colors like '%1%'
untuk mendapatkan semua kaos merah (color = 1), saya juga mendapatkan kaos yang warnanya abu-abu (= 12) dan oranye (= 15).
Bagaimana saya harus menulis ulang query sehingga yang dipilih HANYA warna 1 dan tidak semua warna mengandung angka 1?
Jawaban:
Cara klasik adalah menambahkan koma di kiri dan kanan:
select * from shirts where CONCAT(',', colors, ',') like '%,1,%'
Tetapi find_in_set juga berfungsi:
select * from shirts where find_in_set('1',colors) <> 0
sumber
FIND_IN_SET adalah teman Anda dalam kasus ini
select * from shirts where FIND_IN_SET(1,colors)
sumber
Lihatlah fungsi FIND_IN_SET untuk MySQL.
SELECT * FROM shirts WHERE FIND_IN_SET('1',colors) > 0
sumber
Ini pasti berhasil, dan saya benar-benar mencobanya:
lwdba@localhost (DB test) :: DROP TABLE IF EXISTS shirts; Query OK, 0 rows affected (0.08 sec) lwdba@localhost (DB test) :: CREATE TABLE shirts -> (<BR> -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> ticketnumber INT, -> colors VARCHAR(30) -> );<BR> Query OK, 0 rows affected (0.19 sec) lwdba@localhost (DB test) :: INSERT INTO shirts (ticketnumber,colors) VALUES -> (32423,'1,2,5,12,15'), -> (32424,'1,5,12,15,30'), -> (32425,'2,5,11,15,28'), -> (32426,'1,2,7,12,15'), -> (32427,'2,4,8,12,15'); Query OK, 5 rows affected (0.06 sec) Records: 5 Duplicates: 0 Warnings: 0 lwdba@localhost (DB test) :: SELECT * FROM shirts WHERE LOCATE(CONCAT(',', 1 ,','),CONCAT(',',colors,',')) > 0; +----+--------------+--------------+ | id | ticketnumber | colors | +----+--------------+--------------+ | 1 | 32423 | 1,2,5,12,15 | | 2 | 32424 | 1,5,12,15,30 | | 4 | 32426 | 1,2,7,12,15 | +----+--------------+--------------+ 3 rows in set (0.00 sec)
Cobalah !!!
sumber
Jika kumpulan warna kurang lebih tetap, cara yang paling efisien dan juga paling mudah dibaca adalah dengan menggunakan konstanta string di aplikasi Anda dan kemudian menggunakan
SET
tipe MySQL denganFIND_IN_SET('red',colors)
dalam kueri Anda. Saat menggunakanSET
tipe dengan FIND_IN_SET , MySQL menggunakan satu integer untuk menyimpan semua nilai dan menggunakan"and"
operasi biner untuk memeriksa keberadaan nilai yang jauh lebih efisien daripada memindai string yang dipisahkan koma.Dalam
SET('red','blue','green')
,'red'
akan disimpan secara internal sebagai1
,'blue'
akan disimpan secara internal sebagai2
dan'green'
akan disimpan secara internal sebagai4
. Nilainya'red,blue'
akan disimpan sebagai3
(1|2
) dan'red,green'
sebagai5
(1|4
).sumber
Jika Anda menggunakan MySQL, ada metode REGEXP yang dapat Anda gunakan ...
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp
Jadi Anda akan menggunakan:
SELECT * FROM `shirts` WHERE `colors` REGEXP '\b1\b'
sumber
Anda harus benar-benar memperbaiki skema database Anda sehingga Anda memiliki tiga tabel:
Kemudian jika Anda ingin menemukan semua kemeja yang berwarna merah, Anda akan melakukan kueri seperti:
SELECT * FROM shirt, color WHERE color.color_name = 'red' AND shirt.shirt_id = shirtcolor.shirt_id AND color.color_id = shirtcolor.color_id
sumber
select * from shirts where find_in_set('1',colors) <> 0
Bekerja untuk saya
sumber
1. Untuk MySQL:
SELECT FIND_IN_SET(5, columnname) AS result FROM table
2. Untuk Postgres SQL:
SELECT * FROM TABLENAME f WHERE 'searchvalue' = ANY (string_to_array(COLUMNNAME, ','))
Contoh
select * from customer f where '11' = ANY (string_to_array(customerids, ','))
sumber
Anda dapat mencapai ini dengan mengikuti fungsi.
Jalankan kueri berikut untuk membuat fungsi.
DELIMITER || CREATE FUNCTION `TOTAL_OCCURANCE`(`commastring` TEXT, `findme` VARCHAR(255)) RETURNS int(11) NO SQL -- SANI: First param is for comma separated string and 2nd for string to find. return ROUND ( ( LENGTH(commastring) - LENGTH( REPLACE ( commastring, findme, "") ) ) / LENGTH(findme) );
Dan panggil fungsi ini seperti ini
msyql> select TOTAL_OCCURANCE('A,B,C,A,D,X,B,AB', 'A');
sumber
Semua jawaban tidak benar-benar benar, coba ini:
select * from shirts where 1 IN (colors);
sumber