2016-09-29 2 views
2

Вот моя структура таблицы:Как выбрать теги для блока автозаполнения?

// tags 
+----+------------+----------------------------------+----------+----------+------------+ 
| id | name |   description   | related | used_num | date_time | 
+----+------------+----------------------------------+----------+----------+------------+ 
| 1 | PHP  | some explanations for PHP  | 1  | 4234  | 1475028896 | 
| 2 | SQL  | some explanations for SQL  | 2  | 734  | 1475048601 | 
| 3 | jQuery  | some explanations for jQuery  | 3  | 434  | 1475068321 | 
| 4 | MySQL  | some explanations for MySQL  | 2  | 657  | 1475068332 | 
| 5 | JavaScript | some explanations for JavaScript | 3  | 3325  | 1475071430 | 
| 6 | HTML  | some explanations for HTML  | 6  | 2133  | 1475077842 | 
| 7 | postgresql | some explanations for postgresql | 2  | 43  | 1475077851 | 
| 8 | script  | some explanations for script  | 8  | 3  | 1475077935 | 
+----+------------+----------------------------------+----------+----------+------------+ 

Теперь мне нужно выбрать теги базы на части их имена, также нужно выбрать все соответствующие теги.


Примеры:

Строка: scr. ожидаемый выход:

+----+------------+----------------------------------+----------+----------+------------+ 
| 3 | jQuery  | some explanations for jQuery  | 3  | 434  | 1475068321 | 
| 5 | JavaScript | some explanations for JavaScript | 3  | 3325  | 1475071430 | 
| 8 | script  | some explanations for script  | 8  | 3  | 1475077935 | 
+----+------------+----------------------------------+----------+----------+------------+ 
-- Noted that "jQuery" tag is selected because of its relation with "JavaScript" tag 

Строка: ph. ожидаемый выход:

+----+------------+----------------------------------+----------+----------+------------+ 
| 1 | PHP  | some explanations for PHP  | 1  | 4234  | 1475028896 | 
+----+------------+----------------------------------+----------+----------+------------+ 

String: ys. Ожидаемый результат:

+----+------------+----------------------------------+----------+----------+------------+ 
| 2 | SQL  | some explanations for SQL  | 2  | 734  | 1475048601 | 
| 4 | MySQL  | some explanations for MySQL  | 2  | 657  | 1475068332 | 
| 7 | postgresql | some explanations for postgresql | 2  | 43  | 1475077851 | 
+----+------------+----------------------------------+----------+----------+------------+ 
-- Noted that both "SQL" and "postgresql" are selected because of their relation with "MySQL" tag 

Как я могу это сделать?

На самом деле я могу сделать это так:

SELECT * FROM tags WHERE name LIKE %:str% 

Но мой запрос не поддерживает related столбец.

+0

@ Drew Да, я знаю, это не ваш рекомендованный дизайн базы данных. –

ответ

1

Соедините таблицу с самим собой и найдите строки с вхождением в любом из двух столбцов имени. Таким образом, вы также можете искать имя связанных элементов.

SELECT t1.* 
FROM tags t1 
LEFT JOIN tags t2 ON t1.id = t2.related 
WHERE t1.name LIKE %:str% OR t2.name LIKE %:str%; 
1

Один из вариантов здесь для себя присоединиться к tags таблицу, а затем группа конкатенации соответствующих меток на основе ввода тега. В следующем запросе будет выводиться список тегов CSV, связанных с данным вводом. Например, если :str были 'MySQL', тогда выход был бы 'MySQL,postgresql,SQL'. Если вы используете язык, такой как PHP или Java, достаточно просто взорвать этот список CSV и получить эти предложения в раскрывающемся списке для автозаполнения.

SELECT t1.name, 
     GROUP_CONCAT(t2.name) 
FROM tags t1 
INNER JOIN tags t2 
    ON t1.id = t2.related 
WHERE t1.name LIKE '%:str%'  -- e.g. MySQL 
GROUP BY t1.name 

Вы можете также сделать автообъединение и вернуть одну запись для каждого предложил тег:

SELECT t2.name 
FROM tags t1 
INNER JOIN tags t2 
    ON t1.id = t2.related 
WHERE t1.name LIKE '%:str%'  -- e.g. MySQL 
+0

Почему ваш, например, является полным именем тега? Будет ли он работать и для имен без имени? Как 'mys' или' ysql' или 'ys'? –

+0

Только одно: почему вы не выбрали колонки 'description' и' used_num'? Я пытаюсь сделать что-то вроде этого: http://i.stack.imgur.com/vBjlH.png –

1

Попробуйте использовать

SELECT * FROM tags a WHERE name LIKE %:str% or exist (SELECT id FROM tags b WHERE b.name LIKE %:str% and b.id=a.related) 
1

С автозаполнения должен быть быстрым, вы не можете позволить себе искать в нескольких местах для ответа.

Сборка (и обслуживание) специальной таблицы для автозаполнения; он будет иметь один текстовый (или varchar) столбец со всеми возможными ключевыми словами для данного элемента, плюс еще один столбец (ы) с информацией о том, на что он ссылается.

+0

Звучит неплохо, upvote .. но действительно расплывчато. Не могли бы вы объяснить мне еще несколько объяснений?или структуру таблицы и запрос? –

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