Với MySQL, bạn có thể sử dụng 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
Lưu ý rằng FIND_IN_SET
mong đợi các chuỗi là dấu phẩy được phân tách, không phải dấu phẩy và dấu cách ly thân. Vì vậy, bạn có thể gặp sự cố với thẻ cuối cùng. Cách thực sự tốt nhất là bình thường hóa bảng ; nếu không, bạn có thể xóa dấu cách khỏi các thẻ tags
cột; cuối cùng, bạn có thể khắc phục sự cố bằng cách thêm khoảng trắng vào các thẻ tags
cột:
SELECT * FROM mytable WHERE FIND_IN_SET('ios ', CONCAT(tags,' ')) > 0;
Nếu số lượng thẻ bị hạn chế, bạn có thể cân nhắc chuyển đổi cột thành SET
. Điều này sẽ cải thiện đáng kể hiệu quả.
CẬP NHẬT
Ngoại trừ việc tôi đã chọn sai khoảng trắng sai . Họ là trước đây các chuỗi và không phải sau.
Vì vậy:
SELECT * FROM mytable WHERE FIND_IN_SET(' ios', CONCAT(' ', tags)) > 0;
Nhưng một lần nữa, hãy loại bỏ những khoảng trống đó - chúng chẳng có gì khác ngoài rắc rối :-)
CẬP NHẬT 2
Các công việc trên, bạn nhé. Nhưng, đó là gần như tất cả những gì bạn có thể nói có lợi cho tôi. Không chỉ giải pháp khá * trong * hiệu quả, nó còn làm cho hệ thống bên cạnh không thể bị xâm phạm (đã ở đó, đã làm điều đó, có áo phông và một cái mông nhai lại bên dưới giống nhau). Vì vậy, bây giờ tôi sẽ hơi ủng hộ việc chuẩn hóa, tức là có thêm ít nhất hai bảng sau:
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 );
Cái này tốt hơn bao nhiêu? Hãy để tôi đếm các cách.
- bạn có thể dễ dàng thêm các truy vấn linh hoạt hơn ("có tất cả các thẻ trong iOS, C ++, ..." hoặc "có ít nhất ba thẻ trong số này:(iOS, Python, SQL, .NET, Haskell)". Có, bạn có thể làm điều này với
FIND_IN_SET
, nhưng hãy tin tôi, bạn sẽ không thích nó . - bạn có một từ điển được kiểm soát trong số các thẻ, cho phép bạn kiểm tra xem có thẻ nào được biết không (cũng như dễ dàng tạo danh sách như hộp tổ hợp thả xuống hoặc - có ai nói 'jQuery Autocomplete' không?).
- lưu một số bất động sản đĩa (các thẻ được ghi một lần)
- tìm kiếm nhanh . Nếu bạn đã biết các thẻ bạn đang tìm kiếm và biên dịch trước chúng thành các ID thẻ, chúng sẽ để lại các vết cháy xém cao su SQL trên vỉa hè khi chạy (tìm kiếm được lập chỉ mục cho một số nguyên giá trị!). Và các thẻ sẽ không biên dịch sẽ không có ở đó và bạn sẽ biết điều này ngay cả trước khi bắt đầu tìm kiếm.
- giúp đổi tên thẻ dễ dàng hơn nhiều
- có thể chứa bất kỳ số nào trong tổng số thẻ (bạn có nguy cơ bị cắt ngắn một số thẻ thành 'iOS Developm' sớm hay muộn ...)
Tôi tin rằng "trường CSV" được thống nhất (hoặc) trong số Phản vật chất SQL ( http://pragprog.com/book/bksqla/sql-antipatterns ), và vì lý do chính đáng.