首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQL查询选择连续数字

使用SQL查询选择连续数字
EN

Stack Overflow用户
提问于 2010-02-25 22:16:00
回答 7查看 7.8K关注 0票数 4

这是一张电影院座位预订计划。

代码语言:javascript
复制
Seat No Status
1 Booked
2 Available
3 Available
4 Available
5 Available
6 Available
7 Booked
8 Available
9 Available
10 Available

如果有人想订6张票,他将获得2到6号座位和8号座位,如果有人只想订5张票,他将获得2到6号座位。

如何使用SQL查询(或PHP代码)了解相邻座位是否超过了所请求的座位?

按顺序选择座位是我需要实现的主要目标。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-02-25 23:08:17

试试这个:

代码语言:javascript
复制
select seat, status
from seats
where seat >= (
   select a.seat
   from seats a
      left join seats b on 
         a.seat < b.seat and
         b.seat < a.seat + 4 and
         b.status = 'Available'
   where a.status = 'Available'
   group by a.seat
   having count(b.seat)+1 = 4
   )
limit 4

这被设置为选择四个连续的座位。将"4“的所有实例调整为所需的座位数,以获得您想要的。

票数 5
EN

Stack Overflow用户

发布于 2010-02-25 22:36:47

一次传球。把你的号码放在?的位置。在满足要求时提供第一个序列中的座位号,如果找不到任何序列,则返回NULL

代码语言:javascript
复制
SET @FOUND = 0;
SET @SEAT_MATCHED = NULL;

SELECT
    IF(@FOUND < ?,
        @FOUND := IF(status == 'Booked', 0, @FROM + 1),
        @SEAT_MATCHED := IFNULL(@SEAT_MATCHED, seat_no)
    )
FROM seats
ORDER BY seat_no

SELECT @SEAT_MATCHED;

更多阅读:Control Flow FunctionsUser Variables

NB!此方法仅适用于在分析的间隔中有很少记录的情况!

也许您可以将预订座位的位掩码存储在行中,作为一个整数。例如,对于16个座位的行,数字36884 (二进制1001000000010100)表示预订了第3、5、13和16个座位。这将减少MySQL负载。然后你可以像这样做代码:

代码语言:javascript
复制
<?php

header('Content-Type: text/plain');

// data you get from DB
$seats = bindec('1001000000010100');
$num_seats = 16;

// calculate consecutive free seats
$seats_info = array();
for ($i = 0; $i < $num_seats; $i++, $seats >>= 1) {
    if ($seats & 1) {
        if (isset($first)) {
            $seats_info[$first] = $i - $first;
            unset($first);
        }
    }
    else {
        if (!isset($first)) {
            $first = $i;
        }
    }
}

// output sequences
var_export($seats_info);

?>

这将输出以下内容:

代码语言:javascript
复制
array (
  0 => 2,
  3 => 1,
  5 => 7,
  13 => 2,
)

0是第一个座位。

票数 0
EN

Stack Overflow用户

发布于 2010-02-25 22:49:23

最好将已预订/可用表示为二进制数(例如,1-空闲,0-预订)。如果这样做,您可以优雅地使用聚合函数:

代码语言:javascript
复制
  select seat as n from seats where
      $num_seats = (select sum(status) from seats
         where seat between n and n + $num_seats - 1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2334535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档