SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.04.2010 15:19:45

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Извлечь id c частичным совпадением. Помогите составить запрос

Ребята, привет!

Не могли бы вы помочь мне в составлении запроса. Имеется таблица:

> mysql select * from table test;
+-----------+---------+
| id        | qwe      |
+-----------+---------+
|         5 |       6 |
|         1 |       1 |
|         5 |       1 |
|         9 |       1 |
|         5 |       2 |
|         2 |       1 |
+-----------+---------+

Никак пока не могу придумать запрос, который бы извлекал (не знаю как лучше объяснить) "частичные совпадения" из списка указанных qwe. Например:
- для qwe(1, 6) извлеклось бы id=5
- для qwe(1) извлеклось бы id=1, 2, 5
- для qwe(1, 6, 2) извлеклось бы id=5

Сорри, не уверен, что объяснил доходчиво... Если появятся какие-нибудь идеи, озвучьте, пожалуйста.

Неактивен

 

#2 25.04.2010 15:28:46

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Извлечь id c частичным совпадением. Помогите составить запрос

SELECT id from test t1 JOIN test t2 USING(id) JOIN test t3 USING(id) WHERE t1.qwe=1 AND t2.qwe=6 AND t3.qwe=2;


К сожалению число JOIN нарастает. Нужен индекс на (id,qwe)

Неактивен

 

#3 25.04.2010 15:38:41

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Извлечь id c частичным совпадением. Помогите составить запрос

rgbeast написал:

SELECT id from test t1 JOIN test t2 USING(id) JOIN test t3 USING(id) WHERE t1.qwe=1 AND t2.qwe=6 AND t3.qwe=2;


К сожалению число JOIN нарастает. Нужен индекс на (id,qwe)

Спасибо! Мне тоже первое, что пришло в голову - с AND'ами играться. Но что делать если на этапе выполнения запроса список qwe хранится во временной таблице:

mysql> select * from tmp_table
+-----+
| qwe |
+-----+
|   1 |
|   2 |
|   6 |
+-----+

Сорри, опять же, что не указал этой подробности в первом посте...

Отредактированно FiMko (25.04.2010 15:39:27)

Неактивен

 

#4 25.04.2010 16:02:56

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Извлечь id c частичным совпадением. Помогите составить запрос

Написать процедуру, которая сначала составит запрос, а потом его выполнит через PREPARE. Это если Вы хотели спросить то, что спросили. А если хотели спросить как сделать так, чтобы это работало без JOIN и без многократного выполения запросов, то не знаю как это сделать.

Неактивен

 

#5 26.04.2010 00:00:52

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Извлечь id c частичным совпадением. Помогите составить запрос

rgbeast написал:

Написать процедуру, которая сначала составит запрос, а потом его выполнит через PREPARE. Это если Вы хотели спросить то, что спросили. А если хотели спросить как сделать так, чтобы это работало без JOIN и без многократного выполения запросов, то не знаю как это сделать.

При этом обязательным условием является, что для запроса:

SELECT id from test t1 JOIN test t2 USING(id) JOIN test t3 USING(id) WHERE t1.qwe=1 AND t2.qwe=6 AND t3.qwe=2;

таблица test - не временная, иначе: "ERROR 1137 (HY000): Can't reopen table: 't1'", ибо к одной и той же временной таблице получается множественное обращение из одного запроса... Это ограничение никак не обойти?

Неактивен

 

#6 26.04.2010 14:49:35

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Извлечь id c частичным совпадением. Помогите составить запрос

rgbeast, не можете подсказать как обойти ситуацию для временных таблиц (test - временная таблица)?

Неактивен

 

#7 26.04.2010 21:44:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Извлечь id c частичным совпадением. Помогите составить запрос

К сожалению, нет. Ну, то есть я могу придумать страшного страуса типа
SELECT id, COUNT(*) cnt FROM test WHERE qwe IN (1,2,6) GROUP BY id HAVING cnt = 3
но он будет медленным. Хотя и будет удовлетворять всем условиям.

Неактивен

 

#8 26.04.2010 21:47:39

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Извлечь id c частичным совпадением. Помогите составить запрос

paulus написал:

К сожалению, нет. Ну, то есть я могу придумать страшного страуса типа
SELECT id, COUNT(*) cnt FROM test WHERE qwe IN (1,2,6) GROUP BY id HAVING cnt = 3
но он будет медленным. Хотя и будет удовлетворять всем условиям.

Блин, я попал... sad Это я так понимаю тоже фигня-решение...?

Отредактированно FiMko (26.04.2010 21:48:19)

Неактивен

 

#9 26.04.2010 22:42:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Извлечь id c частичным совпадением. Помогите составить запрос

Ну, это костылик. С первого взгляда — ничем не отличается от способа, которым
MySQL создает временные таблички. Ну, разве что не пытается делать это в памяти
и не удаляет автоматом при обрывах связи.

Неактивен

 

#10 26.04.2010 22:44:28

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Извлечь id c частичным совпадением. Помогите составить запрос

paulus написал:

Ну, это костылик. С первого взгляда — ничем не отличается от способа, которым
MySQL создает временные таблички. Ну, разве что не пытается делать это в памяти
и не удаляет автоматом при обрывах связи.

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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson