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;
ちなみに、複数の可能なカテゴリに一致する行を選択したい場合は、IN (パラメータ化できない) の代わりに FIND_IN_SET を使用して、「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 は、針の項目が 1 つしかない場合にのみ機能します。