我有两个关系表。从他们身上,我想工作了检索项在列中的值是“之间落入”一个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查询我的头!
让我们把定义要查询query_start
和query_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)
)
下面是应您的使用情况下工作的查询。
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
)
);
对于每个产品,查询确保有在qazxswpoi没有记录重叠给定的时间间隔。
我与你的样本数据line_items
测试,它似乎符合您的预期效果,即:
@out=4, @in=6
:产品1中选择@out=4, @in=5
:产品1中选择