使用 MySQL 从范围内选择特定日期

发布于 2024-09-13 06:20:12 字数 369 浏览 2 评论 0原文

我有两个表,

Table A: a_id,timemarker (datetime)

Table B: b_id,start (datetime), stop(datetime), cat(varchar)

table A

149|2010-07-19 07:43:45

150|2010-07-19 08:01:34

151|2010-07-19 07:49:12

table B

565447|2010-07-19 07:30:00|2010-07-19 08:00:00

565448|2010-07-19 08:00:00|2010-07-19 08:20:00

我想选择表 A 中位于表 B 范围内的所有行,

谢谢

i've two tables

Table A: a_id,timemarker (datetime)

Table B: b_id,start (datetime), stop(datetime), cat(varchar)

table A

149|2010-07-19 07:43:45

150|2010-07-19 08:01:34

151|2010-07-19 07:49:12

table B

565447|2010-07-19 07:30:00|2010-07-19 08:00:00

565448|2010-07-19 08:00:00|2010-07-19 08:20:00

i want select all rows from Table A who are in the range of Table B

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

筱武穆 2024-09-20 06:20:12

选择 ANY [B.start, B.end] 内的任何 A

select a.*
from
table a 
where exists ( select * from table b where a.timemarker between b.start and b.stop)
;

OP 写道

我的钥匙有问题!查询执行时间很长。我在表 a 中有超过 40k 行,在表 b 中有超过 140 万行...表内没有关系 – Norman 3 秒前

是的,因为您可能将每个 A 与每个 B = 40k * 1.4M 进行比较比较。

但你的问题是“我该怎么做”,而不是“我是这样做的,我怎样才能让它更快”。

如果你想要更快,你需要在 B(start, end) 上添加索引;

Select any A that is within ANY [B.start, B.end]

select a.*
from
table a 
where exists ( select * from table b where a.timemarker between b.start and b.stop)
;

The OP writes

i have trouble with my keys! the query executes very long. i have got in table a over 40k rows and in table b over 1.4 million rows... there is no relation within the tables – Norman 3 secs ago

Yes, because you're potentially comparing each A with every B = 40k * 1.4M comparisons.

But your question was "how do I do this", not "here's how I'm doing it, how can I make it faster".

if you want it faster, you'll need to add an index on B(start, end);

濫情▎り 2024-09-20 06:20:12
SELECT a.* FROM a
INNER JOIN b ON
  a.timemarker BETWEEN b.start AND b.end
GROUP BY a.id 

我觉得这个应该比较便宜。当然,额外的索引也会有帮助:)

SELECT a.* FROM a
INNER JOIN b ON
  a.timemarker BETWEEN b.start AND b.end
GROUP BY a.id 

I think this should be less expensive. Of course an extra index will help, too :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文