用于读取中间记录的 SQL

标签 sql mysql

我在数据库上有以下数据。

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/

相关文章:

sql - 动态访问grails中groovy类中的DataSource

mysql - postgresql中插入语句中的加密密码抛出错误(需要添加显式类型转换)

mysql - 来自不同表的具有相同名称的列

mysql - 有什么库可以将 mysql 表中的大量 IP 地址解析为国家/地区名称或大陆吗?

mysql - "On Delete Cascade"如果从子表中删除一行

MySQL获取每个产品组具有最小列值的行

php - mysqli - 无法添加或更新子行 - 外键约束失败

用于魔术纸牌游戏的 SQL 数据库

php - codeigniter 模型中的更新查询不起作用

mysql - 在 wordpress 中更改表 SQL 命令