我想在
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)