|
|
|
Сложная выборка из трёх таблиц
|
|||
|---|---|---|---|
|
#18+
В трёх таблицах хранятся сведения о товарах и их параметрах. Таблица 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 Но этот запрос извлекает параметры в виде таблицы "Параметр - значение", но не в виде одной строки результата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 15:29 |
|
||
|
Сложная выборка из трёх таблиц
|
|||
|---|---|---|---|
|
#18+
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. Фиксированное число полей, но достаточно большое для любых практических целей. Тогда запрос с соответствующим количеством лефт джойнов даст нужный результат. Но зачем такой геморрой, вот в чем вопрос. Почему нужно сделать это именно одним запросом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 16:24 |
|
||
|
Сложная выборка из трёх таблиц
|
|||
|---|---|---|---|
|
#18+
ap99ap1. Переменная часть полей загоняется в строку. Насколько мне известно - средствами mysql это сделать невозможно. Нужна групповая операция конкатенации - а ее нет. Может, в какой-нибудь базе и есть... А чем не подходит CONCAT(str1,str2,...) З.Ы. Сори, если не догоняю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 16:58 |
|
||
|
Сложная выборка из трёх таблиц
|
|||
|---|---|---|---|
|
#18+
Спасибо за развёрнутый ответ. ap99apПочему нужно сделать это именно одним запросом? Это не позарез, просто ищу способы сократить время работы скрипта, сделать его более изящным и простым. А то так чтобы вывести список товаров приходится делать кучу запросов - сначала чтобы выяснить с каких букв начинаются названия и сформировать буквенный указатель, потом чтобы выяснить сколько товаров всего чтобы сделать разбивку на страницы, и только потом собственно запрос за параметрами товаров. Каждый из этих запросов работает со всеми трёмя таблицами, в итого время выполнения PHP-скрипта переваливает за 0.5 с. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 17:03 |
|
||
|
Сложная выборка из трёх таблиц
|
|||
|---|---|---|---|
|
#18+
Berkut ap99ap1. Переменная часть полей загоняется в строку. Насколько мне известно - средствами mysql это сделать невозможно. Нужна групповая операция конкатенации - а ее нет. Может, в какой-нибудь базе и есть... А чем не подходит CONCAT(str1,str2,...) З.Ы. Сори, если не догоняю... Это не групповая операция. Ты не можешь написать select concat(name) from table group by id. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 20:56 |
|
||
|
Сложная выборка из трёх таблиц
|
|||
|---|---|---|---|
|
#18+
GreendrakeСпасибо за развёрнутый ответ. Не за что. Я сам люблю получать развернутые ответы на важные вопросы :) Greendrake ap99apПочему нужно сделать это именно одним запросом? Это не позарез, просто ищу способы сократить время работы скрипта, сделать его более изящным и простым. Знаешь, один запрос не всегда бывает быстрее трех. Не всегда. Сильно зависит от того - какой тот один и какие те три. А уж запрос, эмулирующий результат с переменным числом полей - уж точно не будет ни простым - ни изящным. GreendrakeА то так чтобы вывести список товаров приходится делать кучу запросов - сначала чтобы выяснить с каких букв начинаются названия и сформировать буквенный указатель, потом чтобы выяснить сколько товаров всего чтобы сделать разбивку на страницы, и только потом собственно запрос за параметрами товаров. Каждый из этих запросов работает со всеми трёмя таблицами, в итого время выполнения PHP-скрипта переваливает за 0.5 с. Чего-то я не понял. У тебя фильтр по параметрам товаров? Если да - то как ты решаешь вопрос с тем, что параметров у разных товаров, вообще говоря, разное количество? Если нет - зачем тебе три запроса, если можно все сделать одним? Опиши ситуацию подробнее, может подскажу чего путного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 21:05 |
|
||
|
Сложная выборка из трёх таблиц
|
|||
|---|---|---|---|
|
#18+
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Чего-то я не понял. У тебя фильтр по параметрам товаров? Да забей, там обычный фильтр по первой букве одного параметра - названия, с этим проблем нет. Главное то что выше решили. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2005, 01:12 |
|
||
|
Сложная выборка из трёх таблиц
|
|||
|---|---|---|---|
|
#18+
Greendrake ap99apПеременная часть полей загоняется в строку. Насколько мне известно - средствами mysql это сделать невозможно. Нужна групповая операция конкатенации - а ее нет. Может, в какой-нибудь базе и есть... Уряяя - получилось! В MySQL (4.1.10a по крайней мере) есть замечательнейшая функция GROUP_CONCAT. Действительно, чудесно. Мне этого часто не хватало. Мануалы рулят :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2005, 11:25 |
|
||
|
|

start [/forum/topic.php?fid=47&gotonew=1&tid=1854064]: |
0ms |
get settings: |
4ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
165ms |
get topic data: |
9ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 450ms |

| 0 / 0 |
