正确查询以限制搜索结果

时间:2015-08-18 12:56:44

标签: php mysql

我的数据库结构如下:类别

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| parent_id | int(11)      | NO   |     | NULL    |                |
| title     | varchar(260) | NO   |     | NULL    |                |
| slug      | varchar(260) | NO   |     | NULL    |                |
| custom    | int(11)      | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

category_to_content

+-------------+---------+------+-----+---------+----------------+
| Field       | Type    | Null | Key | Default | Extra          |
+-------------+---------+------+-----+---------+----------------+
| id          | int(11) | NO   | PRI | NULL    | auto_increment |
| category_id | int(11) | NO   |     | NULL    |                |
| content_id  | int(11) | NO   |     | NULL    |                |
+-------------+---------+------+-----+---------+----------------+

content 表:

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| heading      | varchar(200) | NO   |     | NULL    |                |
| subheading   | text         | NO   |     | NULL    |                |
| content_text | longtext     | NO   |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

如您所见,categories表中的典型邻接列表模型category_to_content在这里,因为某些类别共享相同的内容... 目前有4个级别,“0级”类别实际上是大/主要类别(在这种情况下是信息库),我想将搜索范围限制为(子)类别/内容属于:当前级别0类别(0级别的parent_id是,好.. 0)。

我正在使用Codeigniter,查询构建器类(不是必需的,我也可以使用普通的sql查询,如果需要),返回的查询如下所示:

SELECT `heading`, `slug`
FROM `content`
JOIN `category_to_content` ON `category_to_content`.`content_id` = `content`.`id`
JOIN `categories` ON `categories`.`id`=`category_to_content`.`category_id`
WHERE `categories`.`id` IN('1,2,3') // current level 0 category //subcategories id's, 12,3, just as example...
AND   (
`content`.`heading` LIKE '%pod%'
OR  `content`.`subheading` LIKE '%pod%'
 )
 LIMIT 10  

但是,在所有情况下,这都不会返回所需的结果。如果我从查询的AND部分删除括号,我得到了结果,但是来自所有主要类别。在大多数情况下,括号中没有结果......

E.g。当搜索词是'about'时,我得到了正确的结果,当我尝试'足病'时 - 没有结果。 样本数据:

Categories category_to_content content

只是为了澄清 - IN部分工作正常,我在每个页面上都有适当的0级子类别 ID。

如果你看不到我的错误(对于MySQL专家来说可能是微不足道的话),我可以发送样本数据(从PhPMyAdmin导出)。

EDIT1:示例:当我输入'pod'时,我想从类别表中获取slug - > '足病',并从'内容'表格 - '什么是足病'。 有趣的是,当我键入'about'时,我得到了期望的结果(从期望的0级 SUB 类别)。数据库导出 - 尽快,所以你可以自己测试......

EDIT2:指向示例数据的链接:http://pastebin.com/YHziZH8f

EDIT3:在这种情况下,我做了3个主要/ level0类别(足病 - 猫id = 1,infobase2,cat id = 208,test3,cat id = 213)。他们(几乎)都有一些子类别,以及与之相关的内容。如果我们在'足病'页面 - current level 0 category subcategories should be searched。我想将搜索仅限于这些子类别(当前级别0子类别)。因此,如果我在'足病学'页面上,我需要'关于'足病类别的内容(对于其他类别没有'关于')。

EDIT4:

成功查询的示例:

SELECT `heading`, `slug`
FROM `content`
JOIN `category_to_content` ON `category_to_content`.`content_id` = `content`.`id`
JOIN `categories` ON `categories`.`id`=`category_to_content`.`category_id`
WHERE `categories`.`id` IN('209,210,211,212')
AND   (
`content`.`heading` LIKE '%about%' 
OR  `content`.`subheading` LIKE '%about%'
 )
 LIMIT 10  

我得到了:关于'Infobase2'和'about-infobase2'slug。

第二个搜索词:

SELECT `heading`, `slug`
FROM `content`
JOIN `category_to_content` ON `category_to_content`.`content_id` = `content`.`id`
JOIN `categories` ON `categories`.`id`=`category_to_content`.`category_id`
WHERE `categories`.`id` IN('209,210,211,212')
AND   (
`content`.`heading` LIKE '%categ%' 
OR  `content`.`subheading` LIKE '%categ%'
 )
 LIMIT 10  

没有结果。如果您测试样本数据,您将看到类别表中有类别2(id = 210),引用为:category_id 210,内容ID 48,category_to_content表和内容表中的类别2标题(id = 48)。我做错了什么......我无法得到那些数据。 :(

1 个答案:

答案 0 :(得分:1)

试试这个:首先我加入所有需要的表格

SELECT content.heading, categories.slug
FROM content
INNER JOIN category_to_content ctc ON ctc.content_id = content.id
INNER JOIN categories ON categories.id = ctc.category_id

然后我们只需要保留“1级类别”(0级类别的直接子类别):我使用子查询而不是列出所需的ID。这种方式更具动态性:如果添加新类别,则无需更新查询。

WHERE categories.parent_id IN (SELECT id FROM categories WHERE parent_id = 0)

最后,按关键字搜索。

AND (content.heading LIKE '%pod%' OR  content.subheading LIKE '%pod%')

(我不确定您是否想在查询的那一部分添加OR categories.slug LIKE '%pod%'。)

如果需要,您可以在最后添加LIMIT 10

关于查询中出错的一个词,就是这一行:

WHERE `categories`.`id` IN('1,2,3')
  • 应该是IN(1,2,3)IN('1','2','3')(请参阅引号)
  • “1级”类别不仅仅是1,2和3