Самостоятельно присоединиться, чтобы найти положение строки - PullRequest
1 голос
/ 07 мая 2011

У меня есть таблица списка слов и другая таблица, в которой есть все символы, используемые в каждом слове.Например, если есть слово «тест», то таблица символов слова будет иметь 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» находится в секундупозиция.Но как мне найти слова, где «е» находится на второй позиции , а «а» на пятой позиции ?Таких условий может быть несколько (до 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
+---------+

Ответы [ 3 ]

2 голосов
/ 07 мая 2011

Для любого количества условий (и даже любого количества совпадений, состоящих из условий) создайте условия таблицы (id, match_id, position, 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 |
+---------+---------+
2 голосов
/ 07 мая 2011
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 |
+---------+

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

1 голос
/ 07 мая 2011

Если бы мне пришлось искать таблицу word_list как есть, без использования таблицы chars, я бы сделал это так

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...