尝试关闭此查询,但不会这样做?
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) AND
FIND_IN_SET ('45',cute_news.keywords)
不确定我是否有两个FIND_IN_SET实例或者什么?
答案 0 :(得分:1)
这两个查询都会返回一些常见结果吗?
查询1
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)
查询2
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 ('45',cute_news.keywords)
您的查询应该返回查询1和查询2的交集。如果结果集为空,或者它们没有共同的结果,则最终查询将没有结果。
答案 1 :(得分:1)
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 ;
以上假设cute_news.category字段在Db行中包含单个类别(例如:“37”),$ category_list是您希望接受的类别列表(“12,24,37,51”) 。下一个词是相反的。您只想在包含关键字列表(“1,22,45”)的字段中找到keyword =“45”。 FIND_IN_SET仅在您有针的单个项目时才有效。