Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложная выборка из трёх таблиц / 8 сообщений из 8, страница 1 из 1
11.05.2005, 15:29
    #33057791
Greendrake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из трёх таблиц
В трёх таблицах хранятся сведения о товарах и их параметрах.

Таблица ITEMS - хранит ID товара и ID его картинки (из 4-й таблицы, но это уже не важно):

CREATE TABLE `items` (
`id` int(11) NOT NULL auto_increment,
`pic` int(11) NOT NULL default '0',
KEY `id` (`id`)
);

Таблица PARAMS - хранит названия параметров товаров

CREATE TABLE `params` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '',
KEY `id` (`id`)
)

Таблица VALUES - хранит значения параметров товаров

CREATE TABLE `values` (
`item_id` int(11) NOT NULL default '0',
`param_id` int(11) NOT NULL default '0',
`value` text NOT NULL
);

Как с помощью одного запроса по ID товара выбрать СТРОКУ, содержащую в колонках его name и все его параметры?


Пока что пользуюсь этим:
select params.name,values.value
from params,values
where values.item_id='".$_GET['id']."'
and values.param_id=params.id

Но этот запрос извлекает параметры в виде таблицы "Параметр - значение", но не в виде одной строки результата.
...
Рейтинг: 0 / 0
11.05.2005, 16:24
    #33057971
ap99ap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из трёх таблиц
GreendrakeВ трёх таблицах хранятся сведения о товарах и их параметрах.

Таблица ITEMS - хранит ID товара и ID его картинки (из 4-й таблицы, но это уже не важно):

CREATE TABLE `items` (
`id` int(11) NOT NULL auto_increment,
`pic` int(11) NOT NULL default '0',
KEY `id` (`id`)
);

Таблица PARAMS - хранит названия параметров товаров

CREATE TABLE `params` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '',
KEY `id` (`id`)
)

Таблица VALUES - хранит значения параметров товаров

CREATE TABLE `values` (
`item_id` int(11) NOT NULL default '0',
`param_id` int(11) NOT NULL default '0',
`value` text NOT NULL
);

[quot Greendrake]Как с помощью одного запроса по ID товара выбрать СТРОКУ, содержащую в колонках его name и все его параметры?

Если одним словом - то никак.
Ты хочешь получить с помощью SQL-запроса результат с переменным числом полей. Это не выйдет так вот напрямую.

Есть два с половиной обходных способа:

1. Переменная часть полей загоняется в строку. Насколько мне известно - средствами mysql это сделать невозможно. Нужна групповая операция конкатенации - а ее нет. Может, в какой-нибудь базе и есть...

1 1/2. Сформировать в описании товара строку со значениями параметров и вносить в нее изменения при всяких изменениях состава и значений параметров этого продукта.

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

Но зачем такой геморрой, вот в чем вопрос. Почему нужно сделать это именно одним запросом?
...
Рейтинг: 0 / 0
11.05.2005, 16:58
    #33058073
Berkut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из трёх таблиц
ap99ap1. Переменная часть полей загоняется в строку. Насколько мне известно - средствами mysql это сделать невозможно. Нужна групповая операция конкатенации - а ее нет. Может, в какой-нибудь базе и есть...
А чем не подходит CONCAT(str1,str2,...)

З.Ы. Сори, если не догоняю...
...
Рейтинг: 0 / 0
11.05.2005, 17:03
    #33058086
Greendrake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из трёх таблиц
Спасибо за развёрнутый ответ.
ap99apПочему нужно сделать это именно одним запросом?
Это не позарез, просто ищу способы сократить время работы скрипта, сделать его более изящным и простым. А то так чтобы вывести список товаров приходится делать кучу запросов - сначала чтобы выяснить с каких букв начинаются названия и сформировать буквенный указатель, потом чтобы выяснить сколько товаров всего чтобы сделать разбивку на страницы, и только потом собственно запрос за параметрами товаров. Каждый из этих запросов работает со всеми трёмя таблицами, в итого время выполнения PHP-скрипта переваливает за 0.5 с.
...
Рейтинг: 0 / 0
11.05.2005, 20:56
    #33058592
ap99ap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из трёх таблиц
Berkut ap99ap1. Переменная часть полей загоняется в строку. Насколько мне известно - средствами mysql это сделать невозможно. Нужна групповая операция конкатенации - а ее нет. Может, в какой-нибудь базе и есть...
А чем не подходит CONCAT(str1,str2,...)

З.Ы. Сори, если не догоняю...


Это не групповая операция. Ты не можешь написать select concat(name) from table group by id.
...
Рейтинг: 0 / 0
11.05.2005, 21:05
    #33058609
ap99ap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из трёх таблиц
GreendrakeСпасибо за развёрнутый ответ.

Не за что. Я сам люблю получать развернутые ответы на важные вопросы :)

Greendrake ap99apПочему нужно сделать это именно одним запросом?
Это не позарез, просто ищу способы сократить время работы скрипта, сделать его более изящным и простым.

Знаешь, один запрос не всегда бывает быстрее трех. Не всегда. Сильно зависит от того - какой тот один и какие те три.

А уж запрос, эмулирующий результат с переменным числом полей - уж точно не будет ни простым - ни изящным.

GreendrakeА то так чтобы вывести список товаров приходится делать кучу запросов - сначала чтобы выяснить с каких букв начинаются названия и сформировать буквенный указатель, потом чтобы выяснить сколько товаров всего чтобы сделать разбивку на страницы, и только потом собственно запрос за параметрами товаров. Каждый из этих запросов работает со всеми трёмя таблицами, в итого время выполнения PHP-скрипта переваливает за 0.5 с.

Чего-то я не понял. У тебя фильтр по параметрам товаров? Если да - то как ты решаешь вопрос с тем, что параметров у разных товаров, вообще говоря, разное количество?

Если нет - зачем тебе три запроса, если можно все сделать одним?

Опиши ситуацию подробнее, может подскажу чего путного.
...
Рейтинг: 0 / 0
12.05.2005, 01:12
    #33058728
Greendrake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из трёх таблиц
ap99apПеременная часть полей загоняется в строку. Насколько мне известно - средствами mysql это сделать невозможно. Нужна групповая операция конкатенации - а ее нет. Может, в какой-нибудь базе и есть...
Уряяя - получилось!
В MySQL (4.1.10a по крайней мере) есть замечательнейшая функция GROUP_CONCAT.
Вот решение:

SELECT items.id, items.pic, group_concat(params.name, '<:>', values.value
SEPARATOR '<_>' ) AS params
FROM items
LEFT JOIN values ON ( values.item_id = items.id )
LEFT JOIN params ON ( params.id = values.param_id )
GROUP BY items.id

В результате в полях params имеем строку, состоящую из пар "параметр<:>значение<_>.........." ;-)

ap99apЧего-то я не понял. У тебя фильтр по параметрам товаров?
Да забей, там обычный фильтр по первой букве одного параметра - названия, с этим проблем нет. Главное то что выше решили. Спасибо.
...
Рейтинг: 0 / 0
12.05.2005, 11:25
    #33059294
ap99ap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная выборка из трёх таблиц
Greendrake ap99apПеременная часть полей загоняется в строку. Насколько мне известно - средствами mysql это сделать невозможно. Нужна групповая операция конкатенации - а ее нет. Может, в какой-нибудь базе и есть...
Уряяя - получилось!
В MySQL (4.1.10a по крайней мере) есть замечательнейшая функция GROUP_CONCAT.

Действительно, чудесно.
Мне этого часто не хватало.
Мануалы рулят :)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложная выборка из трёх таблиц / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]