Запросить выборку строк с необходимыми данными, если есть совпадение, иначе NULL, несколько таблиц? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть следующие таблицы:

CREATE TABLE `db_make` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(24) DEFAULT NULL,
  `status` char(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `ams`.`db_make`
(`id`,
`title`,
`status`)
VALUES
('1', 'DELL', '1'), ('2', 'SAMSUNG', '1'), ('3', 'APPLE', '1');

CREATE TABLE `db_category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(24) DEFAULT NULL,
  `status` char(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `ams`.`db_category`
(`id`,
`title`,
`status`)
VALUES
('1', 'LAPTOP', '1'), ('2', 'MOBILE', '1');

CREATE TABLE `db_model` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(24) DEFAULT NULL,
  `status` char(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `ams`.`db_model`
(`id`,
`title`,
`status`)
VALUES
('1', 'INSPIRON', '1'), ('2', 'IPHONE', '1'), ('3', 'MACBOOK', '1'), ('4', 'NOTEBOOK', '1'), ('5', 'GALAXY', '1');

CREATE TABLE `db_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `status` char(1) DEFAULT NULL,
  `title` text,
  `make` int(11) DEFAULT NULL,
  `model` int(11) DEFAULT NULL,
  `category` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

CREATE TABLE `db_vendoritem` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vendorid` int(11) DEFAULT NULL,
  `category` int(11) DEFAULT NULL,
  `make` int(11) DEFAULT NULL,
  `model` int(11) DEFAULT NULL,
  `item` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

INSERT INTO `ams`.`db_items`
(`id`,
`status`,
`title`,
`make`,
`model`,
`category`,)
VALUES
('1', '1', '5000 Series', '1', '1', '1');

INSERT INTO `ams`.`db_vendoritem`
(`id`,
`vendorid`,
`category`,
`make`,
`model`,
`item`)
VALUES
('1', '1', '1', null, null, null), ('2', '1', '1', '1', null, null), ('3', '1', null, '2', null, null), ('4', '1', null, null, '3', null), ('5', '1', '1', '1', '1', '1');

Продавец может специализироваться на модели, марке, категории или изделии - любой из них или любой их комбинации. В указанном выше поставщике данных с id - 1 специализируется (извините за данные)

- all DELL products,  
- all DELL laptops,
- all laptops,
- all Inspiron laptops

Мне нужен запрос, который печатает - vendorid, сделать заголовок, заголовок категории, заголовок модели, заголовок элемента для всех строк в db_vendoritem как показано ниже:

1, DELL,       ,         ,            ;
1, DELL, LAPTOP,         ,            ;
1,     , MOBILE,         ,            ;
1,     ,       ,  MACBOOK,            ;
1, DELL, LAPTOP, INSPIRON, 5000 series;

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

У вас есть ошибка в вашем коде.


INSERT INTO `ams`.`db_items`
(`id`,
`status`,
`title`,
`make`,
`model`,
`category`,)
VALUES
('1', '1', '5000 Series', '1', '1', '1');

Запятая в

<code>category</code>,)

Не уверен на 100%, соответствует ли это вашей цели, но этот запрос должен дать вам начало


SELECT
 db_vendoritem.`id` AS vendoritem_id, 
 `db_make`.`title` AS make_title,
 `db_model`.`title` AS model_title
FROM 
 `db_vendoritem`
LEFT JOIN
 db_make ON db_make.`id` = db_vendoritem.`make`
LEFT JOIN
  db_model ON db_model.`id` = db_vendoritem.`model`
0 голосов
/ 06 февраля 2020

Вы можете попробовать ниже запрос -

SELECT VI.`vendorid`
      ,M.`title` `make title`
      ,C.`title` `category title`
      ,MO.`title` `model title`
      ,I.`title` ` item title`
FROM `db_vendoritem` VI
LEFT JOIN `db_items`I ON VI.`item` = I.`id`
LEFT JOIN `db_model`MO ON VI.`model` = MO.`id`
LEFT JOIN `db_category` C ON VI.`category` = C.`id`
LEFT JOIN `db_make` M ON VI.`make` = M.`id`;

Здесь он скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...