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

Форум MySQL

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

 

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

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

тема: Помогите со сложным запросом
 
 автор: vovkin29th   (28.08.2009 в 13:15)   письмо автору
 
 

Здавствуйте.

Есть в базе данные о категориях и продуктах.
Связь между ними N:M, тоесть один продукт может принадлежать многим категориям, при этом одна из категорий является основной(отмечено в связях как "is_main = 1").

Таблица категорий:

CREATE TABLE `categories` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL,
  `url` varchar(255) NOT NULL,
  `description` text
  PRIMARY KEY  (`id`)
)


Таблица продуктов

CREATE TABLE `cards` (
  `id` int(11) NOT NULL auto_increment,
  `designer_id` int(11) NOT NULL,
  `c_type` tinyint(4) NOT NULL,
  `sides` tinyint(4) NOT NULL,
  `vert` tinyint(4) NOT NULL,
  `thumb_small` varchar(255) NOT NULL,
  `title` varchar(60) NOT NULL,
  `short_description` varchar(150) NOT NULL,
  `url` varchar(70) NOT NULL,
  PRIMARY KEY  (`id`),
)


Таблица для связи:

CREATE TABLE `cards_categories` (
  `id` int(11) NOT NULL auto_increment,
  `card_id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `is_main` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)


Для конкретной категории мне нужно вытянуть данные о всех продуктах, которые в эту категорию входят, и для каждого продукта данные о категории, которая является основной для продукта.
Данные вытягиваются по category_id(в конкретном примере =19)

Получается что то вроде этого:

SELECT `card`.*,
        `category`.`title` AS `category_title`, `category`.`url` AS `category_url`
FROM `cards` as `card`  
INNER JOIN `cards_categories` AS `rel` ON (`rel`.`card_id` = `card`.`id`)
LEFT JOIN `categories` AS `category` ON ((`category`.`id` = `rel`.`category_id`) AND (`rel`.`is_main` = 1))
WHERE (`rel`.`category_id` = 19)
ORDER BY `card`.`title` DESC
LIMIT 0,9

Проблема в том, что когда данная категория(к примеру `rel`.`category_id` = 19) действительно является основной для продукта, то все данные вытягиваются, в другом случае данные о категории(`category`.`title` AS `category_title`, `category`.`url` AS `category_url`) понятное дело равны NULL.

Помогите плз с запросом, чтобы в обоих случаях все данные вытягивались.

  Ответить  
 
 автор: Trianon   (28.08.2009 в 13:46)   письмо автору
 
   для: vovkin29th   (28.08.2009 в 13:15)
 

Давайте попробуем последовательно подойти, тем более что аккуратная схема этому более чем способствует:

>Для конкретной категории [category_id(в конкретном примере =19)] мне нужно вытянуть данные о всех продуктах, которые в эту категорию входят
SELECT `card`.* 
  FROM `cards_categories` AS `rel` 
    LEFT JOIN `cards` AS `card`
  WHERE `rel`.`category_id` = 19


>, и для каждого продукта данные о категории, которая является основной для продукта.

SELECT `card`.* , `maincat`.*, `maincat`.`title` AS `category_title`, `maincat`.`url` AS `category_url` 
  FROM `cards_categories` AS `r1` 
    LEFT JOIN `cards` AS `card`          ON `card`.`id` = `r1`.`card_id`
    LEFT JOIN `cards_categories` AS `r2` ON `r2`.`card_id` = `card`.`id` AND `r2`.`is_main` 
    LEFT JOIN `categories` AS `maincat`  ON `maincat`.`id` = `r2`.`category_id`
  WHERE `r1`.`category_id` = 19

  Ответить  
 
 автор: vovkin29th   (28.08.2009 в 15:14)   письмо автору
 
   для: Trianon   (28.08.2009 в 13:46)
 

Супер - работает!!!
Спасибо большое.
У Вас есть свой блог о mysql или вроде этого? было бы интересно почитать.

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

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