Как получить нулевой столбец, когда условие не применяется с результатами нескольких строк - PullRequest
0 голосов
/ 28 мая 2020

Мне трудно понять, как получить следующий результат запроса:

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

Вот таблицы, которые у меня есть:

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 должен отображаться только тогда, когда есть является совпадением в специальной таблице, иначе оно должно быть нулевым. Кто-нибудь знает, что я делаю неправильно? Большое спасибо

1 Ответ

2 голосов
/ 28 мая 2020

Используйте tbl5.spe_code вместо tbl1.ord_code в списке SELECT. Если совпадений нет, LEFT JOIN вернет NULL для всех столбцов в таблице special.

Вам также необходимо изменить столбцы, которые вы используете в объединении, с помощью special. это должно быть tbl2.ori_item_code = tbl5.spe_item_code.

И вам нужно использовать LEFT JOIN с таблицей special, чтобы получить несовпадающие строки.

SELECT 
    tbl1.ord_id, 
    UPPER(tbl1.ord_orderno) As ord_orderno, 
    tbl1.ord_total, 
    tbl5.spe_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
  LEFT JOIN
    special tbl5
  ON
    tbl2.ori_item_code=tbl5.spe_item_code
  WHERE 
       tbl1.ord_code IN (SELECT spe_code FROM special JOIN manager ON man_id=1) 
  AND
        tbl1.ord_id=1; 

DEMO

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