MySQL的条件基于选择查询

时间:2018-12-19 06:54:20

标签: mysql

我正在执行以下查询,以从表中获取数据。

SELECT rental_plans.*, 
       ( ( inventory.total_inventory 
           + vehicles.tmp_qty ) - Ifnull(reservation.total_reserved, 0) ) AS 
       vehicle_inventory 
FROM   `rental_plans` 
       INNER JOIN `vehicles` 
               ON `vehicles`.`id` = `rental_plans`.`vehicle_id` 
       LEFT JOIN (SELECT Count(*) AS total_inventory, 
                         vehicle_id 
                  FROM   vehicle_inventories 
                  GROUP  BY vehicle_id) AS inventory 
              ON `inventory`.`vehicle_id` = `vehicles`.`id` 
       LEFT JOIN (SELECT vehicle_id, 
                         Sum(qty) AS total_reserved 
                  FROM   `reservations` 
                  WHERE  ( '2018-12-18' BETWEEN pickup_date AND drop_date ) 
                          OR ( '2018-12-28' BETWEEN pickup_date AND drop_date ) 
                             AND `status` NOT IN ( 'RETURNED' ) 
                  GROUP  BY `vehicle_id`) AS `reservation` 
              ON `rental_plans`.`vehicle_id` = `reservation`.`vehicle_id` 
WHERE  `rental_plans`.`id` > 0 
       AND `rental_plans`.`pickup` = '1' 
       AND `rental_plans`.`drop` = '10' 
ORDER  BY `rental_plans`.`price` ASC 

enter image description here

但是我想根据 vehicle_inventory 处理条件。

我尝试使用... AND vehicle_inventory > 16 order by `rental_plans`.`price` ASC,但这会产生错误,即表中未找到列

1 个答案:

答案 0 :(得分:2)

原因是vehicle_inventory是别名,并且在WHERE子句之后得到解析。您可以阅读有关here的信息。您可以执行以下操作:

SELECT * 
FROM   (SELECT rental_plans.*, 
               ( ( inventory.total_inventory 
                   + vehicles.tmp_qty ) - Ifnull(reservation.total_reserved, 0) 
               ) AS 
               vehicle_inventory 
        FROM   `rental_plans` 
               INNER JOIN `vehicles` 
                       ON `vehicles`.`id` = `rental_plans`.`vehicle_id` 
               LEFT JOIN (SELECT Count(*) AS total_inventory, 
                                 vehicle_id 
                          FROM   vehicle_inventories 
                          GROUP  BY vehicle_id) AS inventory 
                      ON `inventory`.`vehicle_id` = `vehicles`.`id` 
               LEFT JOIN (SELECT vehicle_id, 
                                 Sum(qty) AS total_reserved 
                          FROM   `reservations` 
                          WHERE  ( '2018-12-18' BETWEEN 
                                   pickup_date AND drop_date ) 
                                  OR ( '2018-12-28' BETWEEN 
                                       pickup_date AND drop_date ) 
                                     AND `status` NOT IN ( 'RETURNED' ) 
                          GROUP  BY `vehicle_id`) AS `reservation` 
                      ON `rental_plans`.`vehicle_id` = 
                         `reservation`.`vehicle_id` 
        WHERE  `rental_plans`.`id` > 0 
               AND `rental_plans`.`pickup` = '1' 
               AND `rental_plans`.`drop` = '10')a 
WHERE  a.rental_plans > 16 
ORDER  BY `price` ASC 

SELECT     rental_plans.*, 
           ( (inventory.total_inventory + vehicles.tmp_qty) - Ifnull(reservation.total_reserved, 0) ) AS vehicle_inventory
FROM       `rental_plans` 
INNER JOIN `vehicles` 
ON         `vehicles`.`id` = `rental_plans`.`vehicle_id` 
LEFT JOIN 
           ( 
                    SELECT   Count(*) AS total_inventory, 
                             vehicle_id 
                    FROM     vehicle_inventories 
                    GROUP BY vehicle_id) AS inventory 
ON         `inventory`.`vehicle_id` = `vehicles`.`id` 
LEFT JOIN 
           ( 
                    SELECT   vehicle_id, 
                             Sum(qty) AS total_reserved 
                    FROM     `reservations` 
                    WHERE    ( 
                                      '2018-12-18' BETWEEN pickup_date AND      drop_date) 
                    OR       ( 
                                      '2018-12-28' BETWEEN pickup_date AND      drop_date) 
                    AND      `status` NOT IN ('RETURNED') 
                    GROUP BY `vehicle_id`) AS `reservation` 
ON         `rental_plans`.`vehicle_id` = `reservation`.`vehicle_id` 
WHERE      `rental_plans`.`id` > 0 
AND        `rental_plans`.`pickup` = '1' 
AND        `rental_plans`.`drop` = '10' 
where      ( 
                      inventory.total_inventory + vehicles.tmp_qty) - ifnull(reservation.total_reserved, 0) > 16
ORDER BY   `rental_plans`.`price` ASC