find_in_set和find_in_set不起作用

时间:2013-10-15 19:42:30

标签: mysql find-in-set

尝试关闭此查询,但不会这样做?

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实例或者什么?

2 个答案:

答案 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仅在您有针的单个项目时才有效。