Столбец возвращает нулевое значение в операторе SQL, содержащем несколько SELECT - PullRequest
1 голос
/ 20 марта 2019

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

Во-первых, это таблица из 62 столбцов, которая имеет отношение к бухгалтерскому учету, и мне также нужно извлекать значения из разных таблиц одним вызовом, чтобы получить нужные мне значения перед вставкой.

Допустим, мне нужно сделать вставку в таблицу dailysales, и мне нужно получить значения из таблиц a,b,c и d одновременно. У меня уже есть SQL-оператор для извлечения этих значений, и он работает нормально, за исключением того, что определенный столбец продолжает возвращаться как NULL. Вот мой код:

SELECT `gds_pnr_ref`, `transaction_date`,
       (SELECT `lastname` FROM `a` WHERE `id` = `staff` LIMIT 1) as `lastname`,
       (SELECT `firstname` FROM `a` WHERE `id` = `staff` LIMIT 1) as `firstname`,
       (SELECT `department_name` FROM `b` WHERE `id` = `staff_department` LIMIT 1) as `department`,
       (SELECT `name` FROM `b` WHERE `memo_serial` = '$some_value' LIMIT 1) as `pax_name`,
       (SELECT `customer_name` FROM `c` WHERE `id` = `customer_name` LIMIT 1) as `customer`,
       travel_product,
       (SELECT `vendor_name` FROM `c` WHERE `id` = `vendor` LIMIT 1) as `vendor` 
FROM `d` WHERE `id` = '$some_value' LIMIT 1

Столбец (SELECT customer_name FROM c WHERE id = customer_name LIMIT 1) as customer всегда возвращается как NULL, но когда я запускаю его независимо, он дает мне соответствующее значение.

Я очень открыт для лучшего решения для этого.

Ответы [ 2 ]

3 голосов
/ 20 марта 2019

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

SELECT d.`gds_pnr_ref`, d.`transaction_date`,
       (SELECT a.`lastname` FROM `a` WHERE a.`id` = d.`staff` LIMIT 1) as `lastname`,
       (SELECT a.`firstname` FROM `a` WHERE a.`id` = d.`staff` LIMIT 1) as `firstname`,
       (SELECT b.`department_name` FROM `b` WHERE b.`id` = d.`staff_department` LIMIT 1) as `department`,
       (SELECT b.`name` FROM `b` WHERE b.`memo_serial` = ? LIMIT 1) as `pax_name`,
       (SELECT c.`customer_name` FROM `c` WHERE c.`id` = d.`customer_name` LIMIT 1) as `customer`,
       d.travel_product,
       (SELECT c.`vendor_name` FROM `c` WHERE c.`id` = d.`vendor` LIMIT 1) as `vendor` 
FROM `d`
WHERE d.`id` = ?
LIMIT 1;

Я должен догадаться, откуда берутся столбцы - так что это может быть не на 100% правильно.

Обратите внимание, что я также заменил строкупеременные с заполнителем ?.Это напоминание о том, что вы должны использовать параметры для таких значений.

1 голос
/ 21 марта 2019

Спасибо, ребята, но этот запрос, который я наконец-то сделал, возвращает все мои необходимые значения с ненулевым значением.

SELECT  `a`.`currency`, 
        `a`.`vendor_name`,
        CONCAT(`c`.`lastname`, ' ', `c`.`firstname`) AS `actioned_by`,
        `e`.`department_name` AS `department`,
        `f`.`customer_name` AS `customer`,
        `g`.`currency_name` AS `fl_currency`,
        `b`.`name`,
        `b`.`nuc`,
        `b`.`tax`,
        `b`.`comm` AS `comm_percen`,
        `b`.`comm_tax` AS `comm_tax_value`,
        `b`.`actual_comm`,
        `b`.`service_charge`,
        `b`.`dip`,
        SUM(`b`.`vendor`) AS payable,
        `b`.`charge` AS receivable
FROM ((((((`d`
INNER JOIN `b` ON `d`.`id` = `b`.`memo_serial`)
INNER JOIN `a` ON `d`.`vendor` = `a`.`id`)
INNER JOIN `c` ON `d`.`staff` = `c`.`id`) 
INNER JOIN `e` ON `d`.`staff_department` = `e`.`id`) 
INNER JOIN `f` ON `d`.`customer_name` = `f`.`id`) 
INNER JOIN `g` ON `a`.`currency` = `g`.`id`)  WHERE `d`.`id` = '$some_value'

Использование подзапросов имело некоторые ограничения, например, когда мне нужно было извлечь несколько записей определенного внешнего ключа в определенной таблице.Он продолжает возвращать только значение первой строки.В итоге я использовал INNER JOIN, чтобы получить 6 разных таблиц, чтобы получить свои результаты, и это намного лучше

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