Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите упростить запрос 
V
    Опции темы
maxipub
Дата 6.6.2017, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Добрый день!

Есть таблички:

Код

-- --------------------------------------------------------

--
-- Структура таблицы `test_cat`
--

CREATE TABLE IF NOT EXISTS `test_cat` (
  `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `cat_name` varchar(32) CHARACTER SET cp1251 NOT NULL,
  `cat_data` varchar(32) CHARACTER SET cp1251 NOT NULL,
  UNIQUE KEY `cat_id` (`cat_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

--
-- Дамп данных таблицы `test_cat`
--

INSERT INTO `test_cat` (`cat_id`, `cat_name`, `cat_data`) VALUES
(1, '111', 'qqq'),
(2, '222', 'www'),
(3, '333', 'eee'),
(4, '444', 'rrr'),
(5, '555', 'ttt'),
(6, '666', 'yyy');

-- --------------------------------------------------------

--
-- Структура таблицы `test_res`
--

CREATE TABLE IF NOT EXISTS `test_res` (
  `res_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `cat_id` int(10) unsigned NOT NULL,
  `res_parent_id` int(10) unsigned NOT NULL,
  UNIQUE KEY `res_id` (`res_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

--
-- Дамп данных таблицы `test_res`
--

INSERT INTO `test_res` (`res_id`, `cat_id`, `res_parent_id`) VALUES
(1, 1, 1),
(2, 2, 2),
(3, 3, 1),
(4, 4, 4);


test_res - таблица записей, для каждой записи указан cat_id (раздел) и res_parent_id (id родительской записи, если ее нет res_parent_id == res_id). Таблица test_cat думаю объяснений не требует.

Задача: для указанного res_id выбрать данные из test_res, присоединив к ним test_res.cat_name по соответствующему значению cat_id - это просто, и (а вот тут уже сложнее) test_res.cat_data, у которой test_cat.cat_id == test_res.cat_id для res_id == текущий res_parent_id для текущего res_id. Как-то так. Приведу пример:

Нам нужно выбрать данные для res_id = 2, получается:

res_id => 2,
cat_id => 2,
res_parent_id => 2,
cat_name => '222',
cat_data => 'www' (у строки res_id=2 мы получаем res_parent_id == 2, а для res_id=res_parent_id (res_id=2) значение cat_id == 2)

А вот когда берем res_id = 3, получается:

res_id => 3,
cat_id => 3,
res_parent_id => 1,
cat_name => '333',
cat_data => 'qqq' (а не 'eee', т.к. у строки res_id=3 мы получаем res_parent_id == 1, а для res_id=res_parent_id (res_id==1) значение cat_id == 1)

У меня вышел такой не очень приятный запрос:

Код

SELECT r.*, c.cat_name, c2.cat_data FROM test_res AS r INNER JOIN test_cat AS c ON c.cat_id=r.cat_id INNER JOIN test_cat AS c2 ON c2.cat_id=(SELECT cat_id FROM test_res WHERE res_id=(SELECT res_parent_id FROM test_res WHERE res_id=3)) WHERE r.res_id=3


Ну или так:

Код

SELECT r.*, c.cat_name, c2.cat_data FROM test_res AS r INNER JOIN test_cat AS c ON c.cat_id=r.cat_id INNER JOIN test_cat AS c2 ON c2.cat_id=(SELECT r3.cat_id FROM test_res AS r2 INNER JOIN test_res AS r3 ON r3.res_id=r2.res_parent_id WHERE r2.res_id=3) WHERE r.res_id=3


Ни тот, ни другой вариант мне не нравится. Можно как-то проще?

Это сообщение отредактировал(а) maxipub - 6.6.2017, 15:35
PM MAIL   Вверх
Akina
Дата 7.6.2017, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Цитата(maxipub @  6.6.2017,  16:33 Найти цитируемый пост)
Задача: для указанного res_id выбрать данные из test_res, присоединив к ним test_res.cat_name по соответствующему значению cat_id - это просто, и (а вот тут уже сложнее) test_res.cat_data, у которой test_cat.cat_id == test_res.cat_id для res_id == текущий res_parent_id для текущего res_id. 

Так?
Код

SELECT -- tr1.*, tc1.*, tr2.*, tc2.*
       tr1.res_id, tr1.cat_id, tr1.res_parent_id, tc1.cat_name, tc2.cat_data
FROM test_res tr1, test_cat tc1,
     test_res tr2, test_cat tc2
WHERE tr1.cat_id=tc1.cat_id
  AND tr2.cat_id=tc2.cat_id
  AND tr2.res_id=tr1.res_parent_id
-- WHERE tr1.res_id=3
;



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 7.6.2017, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Akina, спасибо, оно! Все "вертелось" в уме, но ни как не мог прийти к такому виду.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1184 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.