【问题标题】:Selecting distinct rows from a table with several similar rows从具有多个相似行的表中选择不同的行
【发布时间】:2020-05-18 14:57:37
【问题描述】:

我正在尝试使用一个程序列出两个特定日期之间可供出租的所有汽车。我要从中选择的表,预订,看起来与此类似;

CarNumber    StartDate    EndDate
1            2018-01-03   2018-01-05
2            2018-01-09   2018-01-14
3            2018-01-03   2018-01-04
2            2018-01-29   2018-02-2
3            2018-01-12   2018-01-16

这是我目前的程序;

CREATE PROCEDURE available_cars (Start_Date DATE, End_Date DATE)
READS SQL DATA
    BEGIN
        SELECT DISTINCT CarNumber FROM bookings
        WHERE NOT StartDate BETWEEN Start_Date AND End_Date
           OR NOT EndDate BETWEEN Start_Date AND End_Date;
    END;

据我所知,这可以正确检查汽车是否可在 Start_Date 和 End_Date 之间出租,问题是它无法考虑具有相同 CarNumber 的多行。例如,如果我要调用日期为 2018-01-10 到 2018-01-12 的过程,则会显示输出;

CarNumber
1
3
2

很明显,3 号车和 2 号车在这些日期之间不可出租,但由于该表在多行中包含多个预订,因此它也会检查第二个预订。

那么我该如何解释呢?

【问题讨论】:

  • 我使用程序的原因是因为我们的教授希望用程序来完成......没有理由因为这个或 MCRE 而对我的帖子投反对票,我已经提供了表格我从中选择以及与之交互的过程。
  • 也许您被否决了,因为您没有提供创建表和插入语句,以便其他人可以解决您的问题。或者可能是因为有些人不喜欢张贴家庭作业问题。谁知道?
  • 从这个意义上说,这不是家庭作业,这个特定的任务只是为了练习。我真的不明白你的意思,我几乎正在使用我在帖子中提供的东西?唯一的区别是我的预订清单更长。不如不告诉我我做错了,而是提供关于下次如何做的反馈?在描述我的问题时,我看不出我做错了什么。
  • 我确实提供了一个表格,但我不知道您对插入语句的意思。我的问题现在写的很难理解吗?另外,我不知道 SO 是什么意思。
  • 您确实没有提供数据表。一个数据表由一个 CREATE TABLE 语句和一个或多个 INSERT 语句组成。请注意,重叠的规则很简单,即事件 A 在事件 B 结束之前开始,在事件 B 开始之后结束。在这方面接受的答案是不正确的。

标签: mysql mariadb


【解决方案1】:

如果您没有在数据库中存储唯一键,您可以进行复合查询检查所选日期之间的租车,然后在所有可用汽车和当前租用的汽车之间进行 DIFF。

SELECT DISTINCT CarNumber
FROM bookings
WHERE CarNumber NOT IN (
        SELECT CarNumber FROM bookings
        WHERE StartDate BETWEEN Start_Date AND End_Date
        OR EndDate BETWEEN Start_Date AND End_Date)
        OR (StartDate < Start_Date AND EndDate > End_Date;

您可以从该代码轻松创建过程。

【讨论】:

  • 谢谢!这项工作解决了我遇到的问题,是否可以在没有唯一密钥的情况下或通过此工作来做到这一点?
  • 可能不会。您需要提供租车服务的完整汽车清单。而且无论如何都有一些汽车从未被租过的风险,所以无论如何你都不会列出它们。
猜你喜欢
  • 2014-09-16
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 2015-05-27
  • 2017-03-31
  • 2022-08-17
相关资源
最近更新 更多