我在数据库上有以下数据。
ID |SOURCE|DATETIME | URL | TRANSACTION_ID
1001|254|2011-01-01 12:00:00|http://www.domain.com/page1.html|NULL
1001|254|2011-01-01 12:00:00|http://www.domain.com/page3.html|NULL
1305|333|2011-01-01 12:00:00|http://www.domainx.com/page5.html|NULL
1432|777|2011-01-01 12:00:00|http://www.domainx.com/page5.html|NULL
1001|254|2011-01-01 12:00:00|http://www.domain.com/page5.html|NULL
1001|254|2011-01-01 12:00:00|http://www.domain.com/page2.html|NULL
1001|254|2011-01-01 12:00:00|http://www.domain.com/page1.html|457899447
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page1.html|NULL
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page3.html|NULL
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page5.html|NULL
1005|124|2011-01-01 12:00:00|http://www.domainx.com/page5.html|NULL
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page2.html|NULL
1005|214|2011-01-01 12:00:00|http://www.domainx.com/page5.html|NULL
1005|219|2011-01-01 12:00:00|http://www.domainx.com/page5.html|NULL
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page1.html|1235642321
我想要做的是根据事务 ID 和 SOURCE 获取之间的行。 因此,如果想要在最后一笔交易(457899447)之后和新交易(1235642321)之前记录,示例查询如下
SELECT * FROM table WHERE SOURCE=254 && TRANSACTION_ID=1235642321
我应该得到下面的结果
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page1.html|NULL
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page3.html|NULL
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page5.html|NULL
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page2.html|NULL
1003|254|2011-01-01 12:00:00|http://www.domainb.com/page1.html|1235642321
我怎样才能完成这个?
最佳答案
基于仅基于小数据样本的一些假设:
- 要过滤的“来源”与传入的 Transaction_Id 找到的“来源”相同
- 列“Id”是该源表中所有条目的升序整数
我想出了: (根据新数据更新)
WITH cteNew (Id, Source)
as (-- Get Id and Source of transaction @Transaction_Id
select Id, Source
from MyTable
where Transaction_Id = @TransactionId)
SELECT *
from Mytable
where Source = cteNew.Source -- All entries for this source
and Id = cteNew.Id
我将其设为 cte,希望 SQL 优化器能够优化冗余查询(表扫描),但您可以将其分成两个查询,第一个查询将 Id 和 Source 分配给局部变量。
(无法测试,可能需要一些语法调试。)
<小时/>根据 @Chris Lively 的评论进行编辑:
如果是更简单的情况,那么像这样的简单子(monad)查询应该可以工作——并且 MySQL 支持这些,不是吗?
SELECT *
from Mytable
where Id = (select Id
from MyTable
where Transaction_Id = @TransactionId)
这(再次)假设 Transaction_ID 在表中是唯一的。
关于用于读取中间记录的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4585505/