SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 18.10.2010 10:32:50

mdnt87
Участник
Зарегистрирован: 02.06.2010
Сообщений: 8

Помогоите запикнуть квери в процедуру

/****  Запрос выборки  ****/
SELECT book.id as id, book.title as title, book.price as price, book.desc as `desc`, group_concat(DISTINCT auth.author) as authots, group_concat(DISTINCT ganre.ganre) as ganres FROM `books` as book 
left join `author_to_book` as auth_to ON book.id = auth_to.id_bta
left join `author` as auth ON auth_to.id_atb = auth.id_author
left join `ganre_to_book` as ganre_to ON book.id = ganre_to.id_btg
left join `ganre` as ganre ON ganre_to.id_gtb = ganre.id_ganre
where book.id IN (SELECT book.id FROM `books` as book
left join `author_to_book` as auth_to ON book.id = auth_to.id_bta
left join `author` as auth ON auth_to.id_atb = auth.id_author
left join `ganre_to_book` as ganre_to ON book.id = ganre_to.id_btg
left join `ganre` as ganre ON ganre_to.id_gtb = ganre.id_ganre
where ganre.ganre like '%$sGanre%' and auth like '%$sAuth%' and book.title like '%sTitle%' and `book`.`desc` like '$sDesc'
group by book.title) group by book.title
/****  !Запрос выборки  ****/

Собственно входные данные вот (where ganre.ganre like '%$sGanre%' and auth like '%$sAuth%' and book.title like '%sTitle%' and `book`.`desc` like '$sDesc')

вот что у меня получилось

CREATE PROCEDURE `getBook`(sTitle VARCHAR(255),sGanre VARCHAR(255),sAuth VARCHAR(255),sDesc VARCHAR(255),
OUT oId INT,OUT  oTitle VARCHAR(255),OUT  oPrice DECIMAL,OUT  oGanres VARCHAR(1000),OUT  oAuthots VARCHAR(1000),OUT  oDesc TEXT)
BEGIN
    SELECT book.id INTO oId, book.title INTO oTitle, book.price INTO oPrice, book.desc INTO oDesc, group_concat(DISTINCT auth.author) INTO oAuthots, group_concat(DISTINCT ganre.ganre) INTO oGanres FROM `books` as book 
    left join `author_to_book` as auth_to ON book.id = auth_to.id_bta
    left join `author` as auth ON auth_to.id_atb = auth.id_author
    left join `ganre_to_book` as ganre_to ON book.id = ganre_to.id_btg
    left join `ganre` as ganre ON ganre_to.id_gtb = ganre.id_ganre
    where book.id IN (SELECT book.id FROM `books` as book
    left join `author_to_book` as auth_to ON book.id = auth_to.id_bta
    left join `author` as auth ON auth_to.id_atb = auth.id_author
    left join `ganre_to_book` as ganre_to ON book.id = ganre_to.id_btg
    left join `ganre` as ganre ON ganre_to.id_gtb = ganre.id_ganre
    where ganre.ganre like sGanre and auth like sAuth and book.title like sTitle and `book`.`desc` like sDesc
    group by book.title) group by book.title;
END;

естессно не работает, выдает  #1327 - Undeclared variable: book

базку прикрепил.


Прикрепленные файлы:
Attachment Icon book_store2.sql, Размер: 2,869 байт, Скачано: 9,437

Неактивен

 

#2 19.10.2010 00:04:30

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

Re: Помогоите запикнуть квери в процедуру

У Вас какой-то адский запрос. Причем он неправильный как в варианте с ХП,
так и в PHP-варианте. Например, везде упоминается поле auth, которого в
базе нет. Что касается непосредственно book — когда используете DESC,
нужно использовать бэктики везде: book.`desc`.

Неактивен

 

#3 19.10.2010 18:05:26

mdnt87
Участник
Зарегистрирован: 02.06.2010
Сообщений: 8

Re: Помогоите запикнуть квери в процедуру

я знаю что запрос адский. из за гребаной нормализации =/

мне нужно получить книгу с названием, ценой, описанием, всеми авторами и всеми жанрами (хранимыми в отдельных таблицах, и привязанными к книге в еще 2х отдельных таблицах, как видно в дампе)
вто же время если делать все через один селект то тепяетются все жанры или авторы кроме того по которому производилась выборка.

сам запрос рабочий, покрайней мере у меня работает.
а вот как из него сделать функцию я не знаю, вот и обратился к вам.
2 дня париля. не получается ничего.

Неактивен

 

#4 19.10.2010 18:12:14

mdnt87
Участник
Зарегистрирован: 02.06.2010
Сообщений: 8

Re: Помогоите запикнуть квери в процедуру

если по русски то в таблице "книги" есть книга с ид=1 титул=ЙЙ цена=0 описание=ЕЕ
в таблице жанры есть жанр ид_ж=1 жанр=ж1 и ид_ж=2 жанр=ж2
в таблице авторы есть автор ид_а=1 автор=а1 и ид_а=2 автор=а2
в таблице связки например ид_книги=1 ид_автора=1 и ид_книги=1 ид_автора=2
что означает, что книга пренадледит авторам а1, а2
по анологии
в таблице связки например ид_книги=1 ид_жанра=1 и ид_книги=1 ид_жанра=2
что означает, что книга пренадледит авторам ж1, ж2

Неактивен

 

#5 19.10.2010 20:58:36

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

Re: Помогоите запикнуть квери в процедуру

Сам запрос не рабочий — попробуйте, будет ошибка. По крайней мере, над теми
данными, которые Вы приложили. Я бы попробовал переписать его без подзапроса,
и выкинул лишние необдуманные LEFT JOIN (Вы фиксируете значения в подчинен-
ных таблицах, а значит можно использовать просто JOIN). Ну, а что делать с полем
auth — не представляю. Такого поля нету smile

P.S. А что делать с book — я описал.

Неактивен

 

Board footer

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