SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 25.09.2008 19:32:12

pvasya
Участник
Зарегистрирован: 25.09.2008
Сообщений: 3

Вложенные запросы

Здравствуйте!
Есть таблица, состоящая из двух полей, одно varchar(150) (назовём его pole1), другое int (назовём его chislo).
пример данных в таблице:
pole1 |chislo
слово1 1
слово2 2
слово2 3
слово3 3
слово1 3
слово4 5

Нужно сделать выборку чисел из поля chislo, где в втречается два слова("слово1" и слово2"") (слов может быть и больше чем 2). Т.е. для данного примера - это 3. Думаю принцип понятен.

Для это я использую сейчас вложенные запросы, вот пример:
SELECT chislo FROM `testtable` WHERE pole1 = 'слово1' and chislo IN (SELECT chislo FROM `testtable` WHERE pole1 = 'слово2')

Можно ли как-нибудь оптимизировать запрос в данной ситуации?

Заранее всем спасибо!

Неактивен

 

#2 25.09.2008 21:16:58

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

Re: Вложенные запросы

Можно систематизировать запрос, чтобы было легче добавлять несколько слов
SELECT chislo
FROM tablename t1
JOIN tablename t2 USING (chislo)
...
WHERE t1.slovo = 'slovo1' AND t2.slovo = 'slovo2' ... ;

Заодно Вы гарантируете, что по каждому слову таблица будет оббегаться только
один раз. Ключики нужны на оба поля по-отдельности.

Неактивен

 

#3 25.09.2008 22:25:08

pvasya
Участник
Зарегистрирован: 25.09.2008
Сообщений: 3

Re: Вложенные запросы

paulus написал:

Можно систематизировать запрос, чтобы было легче добавлять несколько слов
SELECT chislo
FROM tablename t1
JOIN tablename t2 USING (chislo)
...
WHERE t1.slovo = 'slovo1' AND t2.slovo = 'slovo2' ... ;

Заодно Вы гарантируете, что по каждому слову таблица будет оббегаться только
один раз.

А разве в приведённом мною запросе оббегается не один раз? Или я что-то не так понял?

paulus написал:

Ключики нужны на оба поля по-отдельности.

Вы не могли бы поподробнее этот момент раскрыть? smile

Что скажете про этот запрос:
select chislo
from `testtable` b
join
(select chislo from `testtable` where  pole1 = 'слово1' ) a
ON a.chislo = b.chislo
where pole1 = 'слово2'

?

Неактивен

 

#4 26.09.2008 08:35:34

pvasya
Участник
Зарегистрирован: 25.09.2008
Сообщений: 3

Re: Вложенные запросы

Вот 2 варианта запроса:
1)


select b.chislo
from `testtable` b
join
(select chislo from `testtable` where  pole1 = 'слово1' ) a
ON a.chislo = b.chislo
where b.pole1 = 'слово2'
 


2)

SELECT chislo FROM `testtable`
WHERE pole1 IN ('слово1', 'слово2')
GROUP BY chislo
HAVING count(DISTINCT pole1) = 2
 




Первый выдаёт больше результатов, нежели второй. Какой из этих вариантов лучше?

Неактивен

 

#5 26.09.2008 13:19:23

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

Re: Вложенные запросы

Во втором случае у Вас, кажется, лишний DISTINCT. Без него количество результатов
должно быть одинаковым.

Лучше, наверное, второй - очень элегантное решение, мне нравится smile

Неактивен

 

#6 29.09.2008 05:05:56

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: Вложенные запросы

А GROUP BY (да еще и HAVING) разве не хуже подзапроса?

Неактивен

 

#7 30.09.2008 15:17:51

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

Re: Вложенные запросы

Ну, query plan у него будет такой же, а лаконичность записи и простота масштабирования
соблазняют smile

Неактивен

 

#8 30.09.2008 15:21:41

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

Re: Вложенные запросы

query plan будет такой же в MySQL 6.0, а в 5ой версии еще 50 на 50

Неактивен

 

#9 30.09.2008 15:28:34

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

Re: Вложенные запросы

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

Неактивен

 

#10 02.10.2009 16:45:43

vario
Участник
Зарегистрирован: 02.10.2009
Сообщений: 2

Re: Вложенные запросы

rgbeast написал:

query plan будет такой же в MySQL 6.0, а в 5ой версии еще 50 на 50

а как вообще можно сравнить их query plan ?

Неактивен

 

#11 02.10.2009 19:14:15

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

Re: Вложенные запросы

Query plan можно посмотреть, выполнив команду EXPLAIN SELECT ... для соответствующего запроса.

Неактивен

 

#12 02.10.2009 19:23:23

vario
Участник
Зарегистрирован: 02.10.2009
Сообщений: 2

Re: Вложенные запросы

мммм... explain это понятно
но я не уверен что эксплэин этих двух запросов одинаков будет
я думал вы что то более функциональное в виду имели

Неактивен

 

#13 26.10.2009 14:45:48

Belletti
Участник
Зарегистрирован: 26.10.2009
Сообщений: 2

Re: Вложенные запросы

vario EXPLAIN SELECT юзай

Неактивен

 

Board footer

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