SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 30.05.2008 00:56:31

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Помогите с запросом, пожалуйста

Задача:

есть список слов для поиска, типа - 'слово1,слово2,....'

Нужен такой запрос, который вернул бы такую таблицу:

Код:

word  find
Слово1  0
Слово2  1
Слово3  1

где 1 или 0 - найдено слово или нет, т.е. запрос должен вернуть все слова, которые ему передали, а не только те, которые найдены. Чета никак не соображу...

Заранее спасибо.

Неактивен

 

#2 30.05.2008 02:05:31

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Помогите с запросом, пожалуйста

Пока решил через временную таблицу вот так:

CREATE TABLE `temp_words`  (`word` varchar(255) not null)
ENGINE=memory DEFAULT CHARSET=cp1251

INSERT INTO `temp_words` (`word`)
VALUES ('слово1'),('слово2'),('слово3')

SELECT IF(base.id IS NOT NULL,'1','0') as find,temp_words.word
FROM `temp_words`LEFT JOIN base ON temp_words.word = base.word

DROP TABLE `temp_words`

но хотелось бы конечно как то попроще и одним запросом.

P.S. Каким тегом нужно обрамлять запросы, чтобы подсветка SQL-кода работала? [ code ] - не подсвечивает

Отредактированно Shopen (30.05.2008 16:50:22)

Неактивен

 

#3 30.05.2008 05:55:22

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

Re: Помогите с запросом, пожалуйста

Без временной таблицы тут имхо не обойтись. Я думаю, что это вполне естественное решение для набора сущностей, каждой из которых нужно сопоставить какую-то информацию
(путано, конечно, выразился.. надеюсь, поймете)

Как подсвечивается код, можно прочитать здесь:
http://webew.ru/articles/412.webew

Отредактированно LazY (30.05.2008 06:00:36)

Неактивен

 

#4 30.05.2008 06:02:33

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Помогите с запросом, пожалуйста


select temp.word, if(id is not null,1,0) as find
from base right join
(select 'слово1' as word union
select 'слово2' union
select 'слово3') as temp on temp.word=base.word;
 


P.S. Для подсветки [ syntax=mysql ]  ...  [ /syntax ]

Неактивен

 

#5 30.05.2008 06:03:55

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

Re: Помогите с запросом, пожалуйста

Слушай, точно..
Видимо, спать пора.

Неактивен

 

#6 30.05.2008 16:46:51

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Помогите с запросом, пожалуйста

vasya написал:


select temp.word, if(id is not null,1,0) as find
from base right join
(select 'слово1' as word union
select 'слово2' union
select 'слово3') as temp on temp.word=base.word;
 


P.S. Для подсветки [ syntax=mysql ]  ...  [ /syntax ]

хм... про Union я как то и забыл...

а mysql-ю не будет рвать крышу от такого union если слов будет 1000-2000 и >?

Отредактированно Shopen (30.05.2008 16:47:14)

Неактивен

 

#7 31.05.2008 02:04:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Помогите с запросом, пожалуйста

Shopen написал:

а mysql-ю не будет рвать крышу от такого union если слов будет 1000-2000 и >?

Попробуйте, на самом деле интересно как mysql отработает такой UNION. Возможно, в асимптотике временная таблица будет быстрее.

Неактивен

 

#8 10.06.2008 13:19:51

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Помогите с запросом, пожалуйста

Попробовал.
крышу вроде не рвет. Но какой прекрасный explain у такого запроса smile)
понять по нему что либо - невозможно, а оценка производительности очень важна. Я так понмаю, это все таки не очень правильное использование union

так что пока сделал на временных таблицах. Других нормальных вариантов вроде нету..

Отредактированно Shopen (10.06.2008 13:20:24)

Неактивен

 

Board footer

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