FIND_IN_SET 返回逗号分隔字符串中的索引,从 1 到 N,如果未找到,则返回 0。参数是 FIND_IN_SET(needle, haystack)。
我假设 cute_news.category 和 cute_news.keywords 包含逗号分隔的项目列表,其中“37”和“45”可能是每个列表中的有效值?
即 FIND_IN_SET ('37',cute_news.category),其中匹配行的 cute_news.category 可能包含值“25,45,37,19”。比赛从第 7 位开始。
如所写,您正在搜索不包含 37 的类别和不包含 45 的关键字。
你想要的是:
SELECT cute_news.title, cute_news.id, cute_news.keywords, cute_fields.post_id, cute_fields.alternate_url
FROM cute_news, cute_fields
WHERE cute_news.id = cute_fields.post_id AND
FIND_IN_SET ('37',cute_news.category) > 0 AND
FIND_IN_SET ('45',cute_news.keywords) > 0;
顺便说一句,如果您想要选择匹配多个可能类别的任何行,您可以使用 FIND_IN_SET 而不是 IN(无法参数化)来编写一个将“IN”列表作为参数的存储过程。
DELIMITER $
DROP PROCEDURE IF EXISTS sp_GetAllPostsByCategoriesWithKeyword$
CREATE PROCEDURE sp_GetAllPostsByCategoriesWithKeyword(
in $category_list VARCHAR(1000),
in $keyword VARCHAR(100)
)
BEGIN
SELECT cute_news.title, cute_news.id, cute_news.keywords, cute_fields.post_id, cute_fields.alternate_url
FROM cute_news, cute_fields
WHERE cute_news.id = cute_fields.post_id
AND FIND_IN_SET (cute_news.category, $category_list) > 0
AND FIND_IN_SET ($keyword, cute_news.keywords) > 0
END $
DELIMITER ;
以上假设 cut_news.category 字段在 Db 行中包含单个类别(例如:“37”),而 $category_list 是您希望接受的类别列表(“12,24,37,51”)。下一个术语则相反。您只想在包含关键字列表(“1,22,45”)的字段中查找关键字 =“45”。FIND_IN_SET 仅在您有一个单独的针时有效。