Mysql 验证(子)表中是否存在值,并返回一个";布尔值;结果

Mysql 验证(子)表中是否存在值,并返回一个";布尔值;结果,mysql,sql,Mysql,Sql,我想在MySQL中对订单表创建一个查询,并验证它是否有预订id,如果它没有预订id,它应该在发票表中的所有关系上都可用 我希望返回的值是单个字段中的布尔值 以给出的示例为例,在 对于id#1,我希望立即为true,因为它是可用的 对于id#2,我希望发票表中出现“延迟”假,因为并非所有相关发票都有预订id,只有当发票id#3实际有预订id时,才应返回真,这意味着订单没有预订id时,所有发票都有预订id 我尝试过几种方法,但仍然失败,甚至不知道解决这个问题的最佳方法是什么 提前感谢您的输入 表

我想在MySQL中对订单表创建一个查询,并验证它是否有预订id,如果它没有预订id,它应该在发票表中的所有关系上都可用

我希望返回的值是单个字段中的布尔值

以给出的示例为例,在

  • 对于id#1,我希望立即为true,因为它是可用的

  • 对于id#2,我希望发票表中出现“延迟”假,因为并非所有相关发票都有预订id,只有当发票id#3实际有预订id时,才应返回真,这意味着订单没有预订id时,所有发票都有预订id

我尝试过几种方法,但仍然失败,甚至不知道解决这个问题的最佳方法是什么

提前感谢您的输入

表格顺序:

|----+------------+

| id | booking_id |

|----+------------+

|  1 |        123 |

|  2 |       NULL |

|----+------------+
+----+----------+------------+

| id | order_id | booking_id |

+----+----------+------------+

|  1 |        1 |        123 |

|  2 |        2 |        124 |

|  3 |        2 |       NULL |

+----+----------+------------+
表格发票:

|----+------------+

| id | booking_id |

|----+------------+

|  1 |        123 |

|  2 |       NULL |

|----+------------+
+----+----------+------------+

| id | order_id | booking_id |

+----+----------+------------+

|  1 |        1 |        123 |

|  2 |        2 |        124 |

|  3 |        2 |       NULL |

+----+----------+------------+
模式

CREATE TABLE IF NOT EXISTS `invoice` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `booking_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) 

CREATE TABLE IF NOT EXISTS `order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `booking_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

如果我理解正确,这是您请求的基本查询:

SELECT
    O.id
    , SUM(CASE WHEN I.booking_id IS NOT NULL THEN 1 ELSE 0 END) AS booked_count
    , COUNT(1) AS total_count
    , CASE WHEN SUM(CASE WHEN I.booking_id IS NOT NULL THEN 1 ELSE 0 END) = COUNT(1) THEN 1 ELSE 0 END AS has_all_bookings
FROM
    `order` O
    LEFT JOIN invoice I
        ON O.id = I.order_id
GROUP BY
    O.id
如果要检查发票表中是否没有记录,请将计数(1)作为附加条件添加到最后一个案例语句中(计数(1)=0)


我不明白订单预订时逻辑是如何运作的,但有些发票没有。我认为两者中的任何一个都适用于真实值(或逻辑)。我会避免使用COUNT和GROUP BY,而选择SUBSELECT,它在MySQL中运行良好(我使用的是旧版本5.1.73-1)

此查询在不同的列中为您提供两个值:

SELECT o.*
  , (booking_id IS NOT NULL) AS order_booked
  , (NOT EXISTS (SELECT id FROM `invoice` WHERE order_id=o.id AND booking_id IS NULL)) AS invoices_all_booked
FROM `order` o
当然,您可以组合以下值:

SELECT o.*
  , (booking_id IS NOT NULL OR NOT EXISTS (SELECT id FROM `invoice` WHERE order_id=o.id AND booking_id IS NULL)) AS booked
FROM `order` o

现在,创建一个视图来实现这一点

   create view booked_view as 
    select `order`.id as order_id
    , 
      case when booking_id > 0 then true
            when exists (SELECT id FROM invoice WHERE order_id=`order`.id AND invoice.booking_id IS NULL) then true
      else false
    end  as booked
    from `order` ;
然后只需将视图连接到order表,就可以得到boolean列“booked”

   select o.id, booked from `order` o
        join booked_view on (o.id = booked_view.order_id)

你能给我们举一个你希望得到的结果的例子吗!在我的示例表中看起来有效,但现在没有时间真正深入研究它。我必须将它转换成实际的系统,需要这个:-),一旦我让它工作,赏金就是你的了!谢谢欢迎:)一个小提示可以帮助您将其转换为您的确切问题:计算所有发票,并将其与具有预订id的发票数量进行比较。如果两个数字相等,则给定的订单已全部预订。如果不是(或总计数为零),则存在间隙。