Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрос из трёх таблиц
 
 автор: Meh   (16.02.2010 в 01:24)   письмо автору
 
 

Добрый день.

Помогите с запросом из трёх таблиц: серверы, модели и опции для моделей, соответственно серверам.


CREATE TABLE `servers` (
  `servid` tinyint(3) unsigned NOT NULL COMMENT 'ID сервера',
  `name` varchar(255) NOT NULL COMMENT 'Название сервера',
  PRIMARY KEY (`servid`)
);

INSERT INTO `servers` (`servid`, `name`) VALUES
(10, 'Сервер 10'),
(11, 'Сервер 11'),
(12, 'Сервер 12');


CREATE TABLE `models` (
  `modid` int(11) unsigned NOT NULL,
  `name` varchar(20) NOT NULL DEFAULT '',
  PRIMARY KEY (`modid`)
);

INSERT INTO `models` (`modid`, `name`) VALUES
(1, 'Модель 1'),
(2, 'Модель 2'),
(3, 'Модель 3');


CREATE TABLE `models_servers` (
  `modid` int(11) unsigned NOT NULL,
  `servid` tinyint(3) unsigned NOT NULL,
  `opt1` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Опция 1',
  PRIMARY KEY (`modid`,`servid`),
  KEY `modid` (`modid`),
  KEY `servid` (`servid`)
);

INSERT INTO `models_servers` (`modid`, `servid`, `opt1`) VALUES
(1, 10, 111),
(1, 11, 22),
(3, 12, 33);


На каких-то серверах опции для некоторых моделей могут быть не заданы.


Необходимо для сервера '10' получать результат:
modid  name         opt1 
------------------------- 
1      Модель 1     111
2      Модель 2     NULL   
3      Модель 3     NULL

Для сервера '12':
modid  name         opt1 
-------------------------
1      Модель 1     NULL
2      Модель 2     NULL
3      Модель 3     33

  Ответить  
 
 автор: Meh   (16.02.2010 в 01:36)   письмо автору
 
   для: Meh   (16.02.2010 в 01:24)
 

Да, это нужно постараться, чтоб промучавшись 2 часа, найти решение через минуту после отправки вопроса на форум...

Проверьте уж тогда, может я не прав:

SELECT *
FROM (
SELECT M.`modid` , M.`name` , S.`servid`
FROM `models` M, `servers` S WHERE S.`servid` = 10
) A
LEFT JOIN `models_servers` MS ON A.`servid` = MS.`servid` AND A.`modid` = MS.`modid`

  Ответить  
 
 автор: Лена   (16.02.2010 в 10:38)   письмо автору
 
   для: Meh   (16.02.2010 в 01:36)
 


SELECT m.modid, m.name, ms.opt1
FROM models m
LEFT JOIN models_servers ms ON m.modid = ms.modid
AND ms.servid =12
ORDER BY m.modid


В таблице models_servers не поняла вот этого:
PRIMARY KEY (`modid`,`servid`),
KEY `modid` (`modid`),
KEY `servid` (`servid`)
У нас составной первичный ключ. Зачем отдельно устанавливать ключи для modid и servid?

  Ответить  
 
 автор: Meh   (16.02.2010 в 20:55)   письмо автору
 
   для: Лена   (16.02.2010 в 10:38)
 

Спасибо за запрос. То, что нужно.

По ключам будем думать...

  Ответить  
 
 автор: Trianon   (16.02.2010 в 22:59)   письмо автору
 
   для: Лена   (16.02.2010 в 10:38)
 

> PRIMARY KEY (`modid`,`servid`),
>KEY `modid` (`modid`),
>KEY `servid` (`servid`)
>У нас составной первичный ключ. Зачем отдельно устанавливать ключи для modid и servid?

Готов разделить удивление по вопросу ключа modid.
Но никак не servid.

  Ответить  
 
 автор: Meh   (16.02.2010 в 23:50)   письмо автору
 
   для: Trianon   (16.02.2010 в 22:59)
 

Так... Тогда, помогите разобраться до конца.

EXPLAIN выдаёт совершенно одинаковые результаты как при наличии отдельных ключей KEY `modid` и KEY `servid` в таблице `models_servers`, так и при отсутствии любого из них.
Как же понять, нужны они или нет?

----
2Trianon. Читая ваши посты на форуме, не перестаю удевляться вашей способности видеть "невидимое"...

  Ответить  
 
 автор: Trianon   (17.02.2010 в 01:19)   письмо автору
 
   для: Meh   (16.02.2010 в 23:50)
 

>Так... Тогда, помогите разобраться до конца.
>
>EXPLAIN выдаёт совершенно одинаковые результаты как при наличии отдельных ключей KEY `modid` и KEY `servid` в таблице `models_servers`, так и при отсутствии любого из них.

>Как же понять, нужны они или нет?

Для приведеного Вами запроса - конечно же достаточно составного ключа.
Либо просто ключа modid
Но если Вы попробуете переделать, к примеру, порядок на ORDER BY m.servid (при фиксированном modid) - EXPLAIN тут же выскажет Вам фе.

>
>----
>2Trianon. Читая ваши посты на форуме, не перестаю удевляться вашей способности видеть "невидимое"...

Не понял.
Прозвучало предположение , что составной ключ на двух полях эквивалентен двум простым ключам (или как минимум обеспечивает функциональность двух простых ключей)
Я с ним не согласился. Ну просто потому, что это как бы неправильно :)

  Ответить  
 
 автор: Meh   (17.02.2010 в 10:09)   письмо автору
 
   для: Trianon   (17.02.2010 в 01:19)
 

> Я с ним не согласился. Ну просто потому, что это как бы неправильно :)

Собственно, об этом и речь... ))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования