Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 特定年龄组的检索_Mysql_Sql - Fatal编程技术网

Mysql 特定年龄组的检索

Mysql 特定年龄组的检索,mysql,sql,Mysql,Sql,我想在SQL查询方面寻求一些帮助,了解如何检索特定年龄组的预订。基本上,我想检索那些有成人和儿童客户的预订,这些仅由出生日期决定。儿童被视为15岁以下,成人被视为15岁以上。我想检索那些儿童和成人年龄不超过20岁的预订。如果预订中有一位客户的年龄超过20岁,则不应检索预订。而且预订应该有一个以上的客户。这是一张样品表供你参考- Booking No 123 Customer 1 - March 1, 2008 Customer 2 - Aug 3, 1998 Booking No 456 C

我想在SQL查询方面寻求一些帮助,了解如何检索特定年龄组的预订。基本上,我想检索那些有成人和儿童客户的预订,这些仅由出生日期决定。儿童被视为15岁以下,成人被视为15岁以上。我想检索那些儿童和成人年龄不超过20岁的预订。如果预订中有一位客户的年龄超过20岁,则不应检索预订。而且预订应该有一个以上的客户。这是一张样品表供你参考-

Booking No 123
Customer 1 - March 1, 2008
Customer 2 - Aug 3, 1998


Booking No 456
Customer 1 - March 2, 1986
Customer 2 - Feb 9, 2007
Customer 3 - Apr 10, 1999

Booking No 789
Customer 1 - Jun 7, 1999
SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
需要检索的预订仅为第123号预订。表中未提供年龄,仅使用出生日期-DateDiff进行计算

BookingID CustomerID LName FName DOB
SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
这是我放的where语句

SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.

选择DATEDIFFYEAR,bp.DOB,GETDATE 20岁。

好的,现在我们可以看到发生了什么,以及您出了什么问题

SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
您当前的查询包含以下内容:

WHERE (SELECT DATEDIFF(YEAR ,bp.DOB,GETDATE()) <= 20 
      AND (SELECT DATEDIFF(YEAR ,bp.DOB,GETDATE())) < 15
SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
这相当于那些你21岁,如果你出生在XXXX年的这个日期或之前,你在杂货店看到的标志

SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
不,那是不可能的,我们需要弄清楚我们真正需要什么。重申您的上述条件,我们正在寻找以下所有预订:

SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
至少有一名20岁或20岁以下的客户 至少有一名15岁以下的客户 没有超过20岁的客户 至少有两个顾客。 现在。。。假设我们不关心20岁以下的多个或单个客户,只要他们也都超过15岁,那么我们应该修改第一个条件。此外,如果预订中只有15岁或15岁以下的客户,我们很可能需要提醒他们——他们甚至没有一个几乎成年的客户!很可能我们需要警告这个人是否也会孤身一人!因此,应将条件更改为:

SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
至少有一名15岁以下的客户 没有21岁或以上的客户 请告诉我这个重述是否不正确

SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
既然我们没有条件,我们就可以写我们的陈述了。我们正在寻找预订:

SELECT ReservationID, BookingID, CompanyID, ArrivalDate, CompanyName
FROM Booking
SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
如果至少有一位客户年龄小于15岁:

WHERE EXISTS (SELECT 1
              FROM BookingCustomer
              WHERE BookingCustomer.bookingId = Booking.BookingId
                    -- birthday after 15 years ago today
                    AND BookingCustomer.dob > DATEADD(year, -15, GETDATE()))
SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
也没有21岁或以上的客户:

AND NOT EXISTS (SELECT 1
                FROM BookingCustomer
                WHERE BookingCustomer.bookingId = Booking.BookingId
                      -- birthday before or on 21 years ago today
                      AND BookingCustomer.dob <= DATEADD(year, -21, GETDATE()))
SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.

旁注:对于预订的旅行团和其他东西,大多数时间,他们只关心旅行时的年龄,而不是预订时间,或者今天你运行此程序时发生的任何事情。您可能不想要GETDATE,但可能需要ArrivalDate。因为你会在一列上做数学运算,这将再次强制进行表格扫描,但保持年龄检查——并对其进行一些修改,以考虑预订的提前程度——将提前取消预订,因为肯定有人已经足够大了,或者没有人足够年轻了。

感谢您的详细回复。我尝试了建议的查询,但没有返回任何预订

SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
在存在的位置选择1 来自预订客户 其中BookingCustomer.bookingId=Booking.bookingId -15年前的今天是我的生日 或BookingCustomer.dob>DATEADDyear,-15,BOOKING.ARRIVALDATE

SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
不存在,请选择1 来自预订客户 其中BookingCustomer.bookingId=Booking.bookingId -21年前的今天还是21年前的今天
和BookingCustomer.dob这会让您获得预订。日期计算应基于预订到达日期,因此,如果考虑较旧或未来的预订,getdate将更改到达时的计算年龄

SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
我在预订和预订表之间进行直接连接,按预订和确定每位乘客的年龄分组

SELECT
      R.BookingID
   FROM 
      BookingCustomer BC
         JOIN Reservation R
            ON BC.BookingID = R.BookingID
   group by
      R.BookingID
   having
          SUM( case when DATEDIFF(YEAR , BC.DOB, R.ArrivalDate ) < 16 then 1 else 0 end ) > 0
      AND SUM( case when DATEDIFF(YEAR , BC.DOB, R.ArrivalDate ) >= 16 
                     and DATEDIFF(YEAR , BC.DOB, R.ArrivalDate ) < 21 then 1 else 0 end ) > 0
      AND SUM( case when DATEDIFF(YEAR , BC.DOB, R.ArrivalDate ) > 20 then 1 else 0 end ) = 0
SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
如果查询涉及非聚合字段,您可以将不属于组的其他字段包装为MAX,因为预订始终指向相同的相应预订,并且父预订详细信息无论如何都不会更改

SELECT
      R.BookingID,
      R.ReservationID,
      R.CompanyID,
      R.ArrivalDate,
      R.CompanyName ... rest of query.
SELECT
      R.BookingID,
      MAX( R.ReservationID ) ReservationID,
      MAX( R.CompanyID ) CompanyID,
      MAX( R.ArrivalDate ) ArrivalDate,
      MAX( R.CompanyName ) CompanyName ... rest of query.

也向您展示表架构。您可以共享表的结构吗?没有表结构很难提供答案除了结构之外,实际的类型是什么?还有,到目前为止你得到了什么?你被困在哪里了?我们不是来帮你做工作的,我们是来帮你做你能做的。MySQL中没有接受三个参数的GETDATE和DATEDIFF。。。但它们是SQL Server的一部分。如果您提供的数据被错误地选择为正确的匿名数据,这将很有帮助,但是在阅读了文档并尝试了一个示例查询之后,我对出现的问题有了一个很好的了解。请查看帮助->浏览网站礼仪。将问题标记为已解决有助于其他人了解哪些是有效的,哪些是无效的。此外,对该问题和其他问题进行投票有助于其他人了解哪些是有趣的,哪些是有助于您未来的研发需求的。