|
|
|
| Здавствуйте.
Есть в базе данные о категориях и продуктах.
Связь между ними 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.
Помогите плз с запросом, чтобы в обоих случаях все данные вытягивались. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: Trianon
(28.08.2009 в 13:46)
| | Супер - работает!!!
Спасибо большое.
У Вас есть свой блог о mysql или вроде этого? было бы интересно почитать. | |
|
|
|