0

Trying to pull this query off, but it won't take ?

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)

Not sure if I can't have two instances of FIND_IN_SET or what ?

4

2 回答 2

3

这两个查询都返回一些共同的结果吗?

查询 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 的交集。如果任一结果集为空,或者它们没有共同的结果,则最终查询将没有结果。

于 2013-10-15T19:48:20.507 回答
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 ;

以上假设 cut_news.category 字段在 Db 行中包含单个类别(例如:“37”),而 $category_list 是您希望接受的类别列表(“12,24,37,51”)。下一个术语则相反。您只想在包含关键字列表(“1,22,45”)的字段中查找关键字 =“45”。FIND_IN_SET 仅在您有一个单独的针时有效。

于 2016-05-16T22:37:37.793 回答