mysql – 验证(子)表中值的存在并返回“布尔”结果

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

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

采取给出的例子,在

> id#1的情况我希望它立即成立,因为它可用
> id#2的情况我希望发票表中的“延迟”错误,因为并非所有相关的发票都有booking_id,如果发票ID#3实际上有预订ID,则只应返回true,这意味着所有发票在预订时都有预订ID订单没有.

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

感谢您提前输入!

表顺序:

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

| 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

如果要检查发票表中是否没有记录,请将COUNT(1)添加到最后一个CASE语句作为附加条件(COUNT(1)= 0)

Fiddle Demo

点赞