powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложная выборка из трёх таблиц
8 сообщений из 8, страница 1 из 1
Сложная выборка из трёх таблиц
    #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
Сложная выборка из трёх таблиц
    #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
Сложная выборка из трёх таблиц
    #33058073
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ap99ap1. Переменная часть полей загоняется в строку. Насколько мне известно - средствами mysql это сделать невозможно. Нужна групповая операция конкатенации - а ее нет. Может, в какой-нибудь базе и есть...
А чем не подходит CONCAT(str1,str2,...)

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

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


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

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

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

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

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

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

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

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

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

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


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