2012-11-19 138 views
0

我试图根据类别和关键字(使用like或regexp)得到搜索结果的基础,但问题是,我的查询还返回其他类别的结果它是基于关键字。过滤搜索类别和关键字

SELECT * FROM (`listings`) 
LEFT JOIN `listing_categories` ON `listings`.`ls_id` = `listing_categories`.`ls_id` 
LEFT JOIN `listings_categories` ON `listing_categories`.`lc_id` = `listings_categories`.`lc_id` 
LEFT JOIN `users` ON `users`.`id` = `listings`.`ls_user_id` 
WHERE `listings`.`ls_status` = 1 
AND listings_categories.lc_id = 17 
OR listings_categories.lc_parent = 17 
AND listings.ls_keywords LIKE '%Test Broken Functionality%' 
OR listings.ls_keywords LIKE '%Test%' 
OR listings.ls_keywords LIKE '%Broken%' 
OR listings.ls_keywords LIKE '%Functionality%' 
GROUP BY `listings`.`ls_id` 
ORDER BY MATCH(listings.ls_keywords) AGAINST('Test Broken Functionality') DESC 

分类标识17并没有真正有任何条目或数据库中的职位,但我的查询返回结果从其他类别使用...

+0

因为OR我会怀疑。 – 2012-11-19 21:35:08

+0

是的,我认为是这样,这就是为什么它需要有一些过滤,这是从我认为是独立的类似的条款 –

回答

0

注意括号,几乎像IF的(listings_categories.lc_id = 17 OR listings_categories.lc_parent = 17)ls_keywords LIKE ...周围的语句。这迫使两个必须满足的条件,而不是你有多个条件:

SELECT * FROM (`listings`) 
LEFT JOIN `listing_categories` 
    ON `listings`.`ls_id` = `listing_categories`.`ls_id` 
LEFT JOIN `listings_categories` 
    ON `listing_categories`.`lc_id` = `listings_categories`.`lc_id` 
LEFT JOIN `users` 
    ON `users`.`id` = `listings`.`ls_user_id` 
WHERE `listings`.`ls_status` = 1 
    AND (listings_categories.lc_id = 17 OR listings_categories.lc_parent = 17) 
    AND (listings.ls_keywords LIKE '%Test Broken Functionality%' 
     OR listings.ls_keywords LIKE '%Test%' 
     OR listings.ls_keywords LIKE '%Broken%' 
     OR listings.ls_keywords LIKE '%Functionality%') 
GROUP BY `listings`.`ls_id` 
ORDER BY MATCH(listings.ls_keywords) AGAINST('Test Broken Functionality') DESC