Мне трудно понять, как получить следующий результат запроса:
Позвольте мне показать вам структуру таблицы и запрос, который я использую. Я думаю, что я близок к тому, чтобы понять это правильно, но мне нужна помощь в выяснении того, что не так:
Вот таблицы, которые у меня есть:
CREATE TABLE `manager` (
`man_id` int(11) NOT NULL AUTO_INCREMENT,
`man_firtname` varchar(20) NOT NULL,
`man_lastname` varchar(20) NOT NULL,
PRIMARY KEY (`man_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
man_id man_firtname man_lastname
1 Albert Einstein
CREATE TABLE `orders` (
`ord_id` int(11) NOT NULL AUTO_INCREMENT,
`ord_orderno` varchar(12) NOT NULL,
`ord_man_id` int(11) NOT NULL,
`ord_total` decimal(11,0) NOT NULL,
`ord_code` varchar(10) NOT NULL,
PRIMARY KEY (`ord_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ord_id ord_orderno ord_man_id ord_total ord_code
1 ABCDE 1 160 FFFBBB
CREATE TABLE `orders_items` (
`ori_id` int(11) NOT NULL AUTO_INCREMENT,
`ori_ord_id` int(11) NOT NULL,
`ori_item_code` varchar(10) NOT NULL,
`ori_name` varchar(40) NOT NULL,
`ori_desc` varchar(80) NOT NULL,
PRIMARY KEY (`ori_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ori_id ori_ord_id ori_item_code ori_name ori_desc
1 1 JO123 JohnyT This is a test description
2 1 KK234 SprayC Spray test description
CREATE TABLE `proda` (
`pra_id` int(11) NOT NULL AUTO_INCREMENT,
`pra_code` varchar(10) NOT NULL,
`pra_name` varchar(40) NOT NULL,
PRIMARY KEY (`pra_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
pra_id pra_code pra_name
1 JO123 JohnyT
CREATE TABLE `prodb` (
`prb_id` int(11) NOT NULL AUTO_INCREMENT,
`prb_code` varchar(10) NOT NULL,
`prb_name` varchar(40) NOT NULL,
PRIMARY KEY (`prb_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
prb_id prb_code prb_name
1 KK234 SprayC
CREATE TABLE `special` (
`spe_id` int(11) NOT NULL AUTO_INCREMENT,
`spe_man_id` int(11) NOT NULL,
`spe_code` varchar(10) NOT NULL,
PRIMARY KEY (`spe_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
spe_id spe_man_id spe_code spe_item_code
1 1 FFFBBB JO123
Это мой запрос:
SELECT
tbl1.ord_id,
UPPER(tbl1.ord_orderno) As ord_orderno,
tbl1.ord_total,
tbl1.ord_code,
tbl2.ori_id,
tbl2.ori_item_code,
tbl3.pra_name,
tbl4.prb_name
FROM
orders tbl1
JOIN
orders_items tbl2
ON
tbl1.ord_id=tbl2.ori_ord_id
LEFT JOIN
proda tbl3
ON
tbl2.ori_item_code=tbl3.pra_code
LEFT JOIN
prodb tbl4
ON
tbl2.ori_item_code=tbl4.prb_code
JOIN
special tbl5
ON
tbl1.ord_code=tbl5.spe_code
WHERE
tbl1.ord_code IN (SELECT spe_code FROM special JOIN manager ON man_id=1)
AND
tbl1.ord_id=1;
И вот результат, который я получаю:
ord_id ord_orderno ord_total ord_code ori_id ori_item_code pra_name prb_name
1 ABCDE 160 FFFBBB 1 JO123 JohnyT
1 ABCDE 160 FFFBBB 2 KK234 SprayC
Что я пытаюсь получить взамен?
ord_id ord_orderno ord_total ord_code ori_id ori_item_code pra_name prb_name
1 ABCDE 160 FFFBBB 1 JO123 JohnyT
1 ABCDE 160 NULL 2 KK234 SprayC
По сути, ord_code должен отображаться только тогда, когда есть является совпадением в специальной таблице, иначе оно должно быть нулевым. Кто-нибудь знает, что я делаю неправильно? Большое спасибо