2016-09-29 15 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 | 
+----+------------+----------------------------------+----------+----------+------------+ 

文字列: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 yeah私が知っている、これはあなたの推奨データベース設計ではありません。 –

答えて

1

テーブル自体を結合し、2つの名前列のいずれかにオカレンスがある行を探します。このようにして、関連する要素の名前も検索できます。ここ

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

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 

あなたはまた、自己を行う参加し、それぞれに1つのレコードを返すことができ、タグを提案した:

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

を使用してみてください答えのために複数の場所を探している。

オートコンプリート用の特別なテーブルを構築(および維持)します。特定のアイテムのすべての可能なキーワードを含む1つのtext(またはvarchar)列と、それが参照する項目に関する情報を持つ別の列があります。

+0

素晴らしい、upvote ..しかし、実際に漠然としています。私はいくつかの説明を教えてくれますか?またはテーブル構造とクエリ? –

関連する問題