2011-05-07 39 views
1

我有一個單詞列表表格和另一個表格,其中包含每個單詞中使用的所有字符。對於例如如果有一個單詞「測試」,那麼單詞字符表將有4行t,e,s,t。自加入以查找行位置

mysql> select * from word_list; 
+---------+---------+ 
| word_id | word | 
+---------+---------+ 
|  1 | This | 
|  2 | is  | 
|  3 | test | 
|  4 | message | 
|  5 | for  | 
+---------+---------+ 
5 rows in set (0.00 sec) 

mysql> select * from word_chars; 
+----+---------+----------+-----------+ 
| id | word_id | char_seq | word_char | 
+----+---------+----------+-----------+ 
| 1 |  1 |  1 | T   | 
| 2 |  1 |  2 | h   | 
... 
... 

| 19 |  5 |  2 | o   | 
| 20 |  5 |  3 | r   | 
+----+---------+----------+-----------+ 
20 rows in set (0.00 sec) 

很容易找到「e」位於第二位置的詞。 但我怎麼找到「e」在第二個位置和「a」在第五個位置? 可能有幾個(最多8個)這樣的條件。

select word from word_list as a inner join word_chars as b on a.word_id = b.word_id 
where word_char = 'e' and char_seq = '2'; 
+---------+ 
| word | 
+---------+ 
| test | 
| message | 
+---------+ 
2 rows in set (0.00 sec) 

這裏是相關表格。

drop table if exists word_list; 
create table word_list (word_id int not null auto_increment, word varchar(255), primary key (word_id)) ENGINE=InnoDB; 
insert into word_list (word) values ('This'), ('is'), ('test'), ('message'), ('for'); 

drop table if exists word_chars; 
create table word_chars (id int not null auto_increment, word_id int, char_seq int, word_char varchar(50), primary key (id), unique key `word_seq` (word_id, char_seq), foreign key (word_id) references word_list(word_id)) ENGINE=InnoDB; 
insert into word_chars (word_id, char_seq, word_char) values (1, 1, 'T'), (1, 2, 'h'), (1, 3, 'i'), (1, 4, 's'), (2, 1, 'i'), (2, 2, 's'), (3, 1, 't'), (3, 2, 'e'), (3, 3, 's'), (3, 4, 't'), (4, 1, 'm'), (4, 2, 'e'), (4, 3, 's'), (4, 4, 's'), (4, 5, 'a'), (4, 6, 'g'), (4, 7, 'e'), (5, 1, 'f'), (5, 2, 'o'), (5, 3, 'r') 

更新

是否有可能在同一查詢返回的計數或最大(char_seq)? 因此,例如。在下面的答案,它應該看起來像......

+---------+ 
| word | count 
+---------+ 
| message | 7 
+---------+ 
+0

我希望列'word_char'的類型是'ENUM'。這對性能**和**存儲非常有用。 – Rudie 2011-05-07 18:00:41

回答

2
select word from word_list as a 
inner join word_chars as b on a.word_id = b.word_id 
inner join word_chars as c on a.word_id = c.word_id 
where b.word_char = 'e' and b.char_seq = '2' 
and c.word_char = 'a' and c.char_seq = '5'; 

結果:

+---------+ 
| word | 
+---------+ 
| message | 
+---------+ 

不能立即想到一個優雅的方式來處理任何數量的可能的條件 - 也許有人其他人有一個想法。

+0

謝謝你。我會在PHP中做到這一點。但問題已經更新。 – shantanuo 2011-05-07 18:53:09

+0

選擇單詞,計數(單詞)...按單詞分組;應該這樣做 – YXD 2011-05-07 20:18:33

1

如果我不得不像使用字符表一樣搜索word_list表,我會這樣做。

select word from 
word_list 
where Substring(word,2,1) = 'e' 
and Substring(word,5,1) = 'a' 
2

對於任何數量的條件下(甚至任何數量由條件匹配)創建表的條件(ID,match_id,位置char),並且使用查詢:

SELECT a.word, d.matched FROM 
     (SELECT b.word_id, count(b.id) as matched FROM word_chars b 
     JOIN conditions c 
     ON c.position = b.char_seq 
     AND c.char = b.word_char 
     WHERE c.match_id = 1 
     GROUP BY b.word_id) d 
JOIN word_list a 
ON a.word_id = d.word_id 

返回的數匹配的字符在一個給定的條件集合中匹配match_id(這裏是1)。

+---------+---------+ 
| word | matched | 
+---------+---------+ 
| test |  1 | 
| message |  2 | 
+---------+---------+