Mysql 验证(子)表中是否存在值,并返回一个";布尔值;结果
我想在MySQL中对订单表创建一个查询,并验证它是否有预订id,如果它没有预订id,它应该在发票表中的所有关系上都可用 我希望返回的值是单个字段中的布尔值 以给出的示例为例,在Mysql 验证(子)表中是否存在值,并返回一个";布尔值;结果,mysql,sql,Mysql,Sql,我想在MySQL中对订单表创建一个查询,并验证它是否有预订id,如果它没有预订id,它应该在发票表中的所有关系上都可用 我希望返回的值是单个字段中的布尔值 以给出的示例为例,在 对于id#1,我希望立即为true,因为它是可用的 对于id#2,我希望发票表中出现“延迟”假,因为并非所有相关发票都有预订id,只有当发票id#3实际有预订id时,才应返回真,这意味着订单没有预订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的发票数量进行比较。如果两个数字相等,则给定的订单已全部预订。如果不是(或总计数为零),则存在间隙。