2013-10-15 98 views
0

試圖關閉此查詢,但它不會採取?find_in_set AND 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實例或什麼?

+0

發佈cute_news和cute_fields表模式...和/或一些示例行。 –

回答

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的交集如果任何一個結果集是空的,或者如果他們沒有共同的結果,那麼最終的查詢將沒有結果。

+0

查詢1和查詢2都返回結果 – eberswine

+1

它們是否有共同的結果? –

+0

你是對的,沒有什麼共同之處...... wtf – eberswine

1

FIND_IN_SET返回逗號分隔的字符串中的索引,從1到N或0如果未找到。參數是FIND_IN_SET(針,乾草堆)。

我假設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字段包含一個類別(例如:「37」)數據庫行和$ category_list是你願意接受的類別列表(「12,24,37 ,51" )。下一屆是相反的。您只想在包含關鍵字列表(「1,22,45」)的字段中找到關鍵字=「45」。 FIND_IN_SET只適用於針頭有單個物品的情況。