10/10/2018, 10:23

Vấn đề tìm kiếm trong mysql

Mình có 1 table có cái column mang nội dung sau:

1,5,6,8 <== row 1
5,11,2,3 <== row 2

Vậy bây giờ mình có 1 là danh mục bán hàng, 11 là công nghệ thông tin khi mà $_GET có nội dung là 1 thì nó liệt kê ra row 1 và ngược lại nếu = 11 thì là row 2.
Còn 5 thì show ra cả row 1 và 2! Ai giúp mình với
nnanh01 viết 12:30 ngày 10/10/2018
Theo ý của bạn thì mình nghĩ là chúng ta so sánh chuỗi tuyệt đối (so sánh bằng - =), không dùng so sánh tương đối (like %*%) sẽ giải quyết đc.
thuyduongcd viết 12:27 ngày 10/10/2018
Làm sao mà so sánh bằng được khi mà nó là 1 chuỗi.
Mách bạn một kinh nghiệm, nếu thiết kế DB kiểu này bạn nên cân đối các chuỗi cho nó cùng độ dài (fixed length).
Ví dụ, row 1 của bạn thay vì 1,5,6,8 thì bạn nên sửa thành 01,05,06,08, row 2 là 05,11,02,03
Khi đó chỉ cần sử dụng LIKE %01% hoặc LIKE %11%, sẽ giải quyết dễ dàng hơn
nnanh01 viết 12:30 ngày 10/10/2018
Chuỗi không so sánh bằng đc sao?

Tìm kiếm thì không nên so sánh bằng thôi, chứ chuỗi sao lại không thể so sánh bằng đc.
thuyduongcd viết 12:38 ngày 10/10/2018
Không phải chuỗi thì không so sánh bằng được nhưng trường hợp này không thể so sánh bằng. Bạn thử dùng so sánh bằng để giải quyết trường hợp trên xem
diepnghitinh viết 12:37 ngày 10/10/2018
theo cách của thuyduong thì 01,05,06,08 có thể giải quyết nhưng phải thêm 0 đến số 10 ngoài ra còn có thể làm như sau: ,1,2,3,4, như vậy lúc like chỉ việc làm như sau %,$value,%. Nhưng với câu lệnh sau có thể sẽ giải quyết dc tất cả! Đã test và thấy khá chính xác
PHP Code:
where `fieldlike '$value,%' or `fieldlike '%,$value' or `fieldlike '%,$value,%' or `field` = '$value' 
thuyduongcd viết 12:30 ngày 10/10/2018
Nhiều điều kiện quá truy vấn sẽ lâu hơn
diepnghitinh viết 12:39 ngày 10/10/2018
Vậy còn cách nào để xử lý tốt hơn ???
thuyduongcd viết 12:29 ngày 10/10/2018
thiết kế lại Database
s.code viết 12:24 ngày 10/10/2018
Phần lưu trữ dữ liệu đã sai. Trước mình đã từng làm cho phần news với chức năng multi category (giống WP) và đã vấp vấn đề này.

Sau đó đã fix bằng cách lưu theo kiểu

01:05:08:011: => bất kỳ ID nào sau trước khi lưu vào DB phải thêm số 0 đằng trước và : đằng sau. Rồi gộp tất cả nó lại => save

Sau đó dùng like '%011:%' la` ok => như này không cần fix độ dài như bạn Dương đã nói.

Như vậy khi lọc category thì mới ra kết quả chính xác.

Nếu hiện trạng Data của bạn đã như vậy rồi thì vô phương cứu chữa.

Chỉ còn một cách viết 1 đoạn mã nhỏ thiết lập lại format của field đó. rồi sửa lại đoạn code lọc dữ liệu.
Bài liên quan
0