我的数据库结构如下:类别表
+-----------+--------------+------+-----+---------+----------------+
| 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'时,我得到了正确的结果,当我尝试'足病'时 - 没有结果。 样本数据:
只是为了澄清 - 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)。我做错了什么......我无法得到那些数据。 :(
答案 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')
(请参阅引号)