prod_catg LIKE '1,%' --matches when 1 is the first category
OR prod_catg LIKE '%,1,%' --matches when 1 is somewhere in the middle
OR prod_catg LIKE '%,1' --matches 1 when is the last category
Dù sao đi nữa, bạn nên cấu trúc lại giản đồ của mình bằng cách thêm một bảng danh mục và tham chiếu đến nó trên bảng sản phẩm (chính)
CHỈNH SỬA
một cách khác để đối mặt với sự cố này là sử dụng REGEXP
điều này sẽ dẫn đến WHERE
ngắn hơn mệnh đề (đây là những gì tôi đã sử dụng để kiểm tra):
DECLARE @regexp VARCHAR(100);
SET @regexp = '^1,.*|.*,1$|.*,1,.*';
SELECT
'1,11,15,51,22,31' REGEXP @regexp AS test1,
'51,11,15,1,22,31' REGEXP @regexp AS test2,
'11,15,51,22,31,1' REGEXP @regexp AS test3,
'7,11,15,51,22,31' REGEXP @regexp AS test4,
'51,11,15,7,22,31' REGEXP @regexp AS test5,
'11,15,51,22,31,7' REGEXP @regexp AS test6;
điều này sẽ khớp với prod_catg
của bạn chống lại Biểu thức chính quy '^1,.*|.*,1$|.*,1,.*'
returnnig 1 (TRUE)
nếu nó khớp, 0 (FALSE)
ngược lại.
Sau đó, mệnh đề WHERE của bạn sẽ giống như sau:
WHERE prod_catg REGEXP '^1,.*|.*,1$|.*,1,.*'
giải thích về regexp:
^1,.* --matches 1 at the beginning of a string followed by a `,` and any other char
.*,1$ --matches 1 at the end of a string preceded by a `,` and any other char
.*,1,.* --matches 1 between two `,` which are sourrounded by any other chars
| --is the OR operator
Tôi chắc rằng regexp này có thể nhỏ gọn hơn nhiều nhưng tôi không giỏi lắm với các biểu thức chính quy
chắc chắn bạn có thể thay đổi danh mục bạn đang tìm kiếm trong biểu thức chính quy (thử thay thế 1
với 7
trong ví dụ trên)