选择 - 筛选出符合条件的结果

问题描述 投票:0回答:2

我有两个关系表。从他们身上,我想工作了检索项在列中的值是“之间落入”一个SELECT查询。

我是新来的MySQL和那种查询是不是我的坚强的一面。我敢肯定,我期待在从错误的角度的问题。希望我可以从这里得到一些立足之地!

好吧,这里有云:我有两个表:产品和line_items其中的product_id是先用一个与后者的匹配字段一对多关系的主键。该表中保存了下列:

制品

product_id

line_items

product_id
timestamp_out
timestamp_in

时间戳表明当一个产品被取出(出)的股票,当它已经(在)重新插入股票一次。同样的product_id可以line_items多次出现,并且timestamp_out总是小于timestamp_in。

我想要做的是检索product_ids为当一个产品是不是“签出”。

例如。 PRODUCT_ID 1,可能在line_items以下行:

第一排

-timestamp_out: 1
-timestamp_in: 3

第二行

-timestamp_out: 6
-timestamp_in: 7

我正在努力实现的是,将采取两个任意时间戳和返回的不是那些时间戳之间签出(产品查询例如,如果在查询中的时间戳出来:4和6,然后PRODUCT_ID 1不应该被返回,因为该跨度的上面的光谱与第二行的时间跨度越过;仅当在查询中的时间戳是出来:4和:5,或以上7应PRODUCT_ID 1被返回)。

我试着查询几个变化,但一个我认为是“最接近”将是:

SELECT
    products.product_id
FROM
    products
INNER JOIN
    line_items
ON
    (products.product_id = line_items.product_id)
WHERE
    6 NOT BETWEEN line_items.timestamp_out AND timestamp_in
OR 
    4 NOT BETWEEN line_items.timestamp_out AND timestamp_in

这一点,因为它返回的product_id 1看到的情况是怎样的第一行真不工作,虽然。如果我把它反向:

WHERE
    6 BETWEEN line_items.timestamp_out AND timestamp_in
OR 
    4 BETWEEN line_items.timestamp_out AND timestamp_in

......这当然是在查询跨度与第二排的跨度跨越也返回PRODUCT_ID 1。

希望我做这个问题清楚了!我必须承认,我觉得有点想吐的看着这在过去几个小时,而能够环绕怎么做这类的MySQL查询我的头!

mysql
2个回答
0
投票

让我们把定义要查询query_startquery_end范围的时间戳。

line_items行的时间戳范围如果任query_end < timestamp_out(产品结束前查询范围取出的股票)或query_start > timestamp_in不与查询范围重叠(查询范围开始的产品返回到股票后)。

我们正在寻找一个产品,所有的line_item行该产品的不与范围重叠 - 或交替,那里不存在的行不重叠。

select *
from product p
where not exists (
    select *
    from line_items i
    where i.product_id = p.product_id
    and not (@query_end < i.timestamp_out or @query_start > i.timestamp_in)
)

0
投票

下面是应您的使用情况下工作的查询。

select p.*
from products p
where not exists (
    select 1
    from line_items l
    where 
        l.product_id = p.product_id
        AND NOT (
               l.timestamp_in  < @out
            OR l.timestamp_out > @in
        )
  );

对于每个产品,查询确保有在qa​​zxswpoi没有记录重叠给定的时间间隔。

我与你的样本数据line_items测试,它似乎符合您的预期效果,即:

  • in this db fiddle:没有结果
  • @out=4, @in=6:产品1中选择
  • @out=4, @in=5:产品1中选择
© www.soinside.com 2019 - 2024. All rights reserved.