2015-08-18 3 views
1

Моя структура БД выглядит следующим образом: категории таблицыПраво запроса, чтобы ограничить результаты поиска

+-----------+--------------+------+-----+---------+----------------+ 
| 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» на самом деле являются большими/основными категориями (информационные базы в этот случай), и я хочу ограничить поиск JUST (суб) категориями/содержанием, которые принадлежат: Текущий уровень 0 Категория (parent_id уровня 0 категории, ну .. 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 

Однако это не возвращать желаемые результаты во всех случаях. Если я удалю круглые скобки из части запроса, я получил результаты, НО из всех основных категорий. В скобках нет результатов, в большинстве случаев ...

E.g. когда поисковый запрос «около», я получил правильные результаты, когда я пытаюсь использовать «подиатрию» - никаких результатов. Образец данных:

Categories category_to_content content

Просто чтобы прояснить - В часть работает отлично, я получил должный уровень 0 Подкатегории IDS на каждой странице.

Если вы не видите мою ошибку (возможно, что-то тривиальное для гуру MySQL), я могу отправить образцы данных (экспорт из PhPMyAdmin).

EDIT1: Пример: Когда я набираю 'pod', я хотел бы получить slug из таблицы категорий -> 'podiatry' и заголовок из таблицы content - 'What is podiatry'. Интересно, когда я набираю 'about', я получаю желаемые результаты (от желаемого уровня 0 SUB категории). экспорт DB - как можно быстрее, так что вы можете проверить по вашей собственной личности ...

EDIT2: Ссылка на выборку данных: http://pastebin.com/YHziZH8f

EDIT3: в этом случае, я сделал 3 основные/level0 категории (Podiatry - кошка ID = 1, infobase2, cat id = 208, test3, cat id = 213). У всех (почти) есть некоторые подкатегории и связанный с ними контент. Если мы находимся на странице «podiatry» - current level 0 category subcategories should be searched. Я хочу ограничить поиск только этими подкатегориями (текущий 0 подкатегорий). Итак, если я на странице «podiatry», мне нужно «о» содержание только для категории подиатрии (нет «около» из/для остальных категорий).

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' и 'о-infobase2' слизняк.

Второй термин поиска:

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, идентификатор контента 48, в таблице категории_о_контента и заголовок категории 2 в таблице содержимого (id = 48). Что я делаю неправильно ... Я не могу получить эти данные. :(

+0

Данные образца и желаемый результат, пожалуйста, – Strawberry

+0

Я не вижу категории уровня 0 в таблице 'category_to_content' (по крайней мере, в том, что вы здесь показываете). Можете ли вы показать соответствующие данные? –

+0

Да, пожалуйста, дайте мне несколько минут. @caCtus, уровень 0 категорий не содержит контента, я вышлю mysql-дамп за несколько минут и отредактирую вопрос, чтобы показать желаемые результаты ... – sinisake

ответ

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 категории): Я использовал подзапрос вместо листинга необходимо . идентификаторы Это более динамичный, что путь: если вы добавите новые категории, нет необходимости обновлять запрос

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
+0

Спасибо за помощь, но ... я до сих пор не получаю правильных результатов. Btw, я создаю IN часть динамически (1,2,3), есть только пример, но я, вероятно, буду использовать подзапрос, а не текущий способ, которым я пользуюсь ... Кажется, я не объяснил проблему хорошо ... будет попробуй еще раз. :) Например. если я ставлю «about» в качестве поискового запроса - я получил 3 результата, мне нужен только один. Если я на странице 'podiatry' -> id is '1' - это текущая родительская категория, и все подкатегории podiatry удалены из БД) ... Попробовал изменить ваш подзапрос, чтобы получить только один результат, я установил parent_id до 1 - нет результатов. С 0, - избыточные результаты. – sinisake

+0

Если вы пробовали запросы по моим данным образца, вы знаете, что я имею в виду, надеюсь ... :) – sinisake

+0

Я попробовал, и он сделал то, что я ожидал, по-моему, я до сих пор не понимаю, что вы пытаетесь сделать. :/ –

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