2013-10-15 3 views
0

Попытка вытащить этот запрос, но это не займет?find_in_set И 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

Как оба эти запроса возвращают некоторые общие результаты?

Query 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) 

Query 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 и Query 2. Если какой-либо результирующий набор пуст, или если у них нет никаких результатов общих , то окончательный запрос не будет иметь никаких результатов.

+0

Query 1 и Query 2 оба возвращают результаты – eberswine

+1

Есть ли у них какие-либо результаты? –

+0

Вы правы, ничего общего ... wtf – eberswine

1

FIND_IN_SET возвращает индекс в строке, разделенной запятой, от 1 до N или 0, если не найден. Аргументами являются FIND_IN_SET (игла, стог сена).

Я предполагаю, что cute_news.category и cute_news.keywords содержат список предметов, из которых «37» и «45» могут быть допустимым значением в каждом списке?

i.e. 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 поле содержит одну категорию (например: «37») в строке Db и $ category_list список категорий вы хотите принять ("12,24,37 , 51"). Следующий термин - противоположный. Вы хотите найти ключевое слово = «45» в поле, которое содержит список ключевых слов («1,22,45»). FIND_IN_SET работает только тогда, когда у вас есть отдельный предмет для иглы.

Смежные вопросы