形成此查询的最佳方式

时间:2018-03-21 06:13:43

标签: mysql sql

我有三张桌子。

myTransTable,myMasterTable 1,MymyMasterTable 2

myTransTable有很多条目'Rank.No'自动启动字段是识别个人记录。 'U.Name'包含用户名。每个用户可以在此表中拥有多条记录。但是,按“U.Name”分组后,Rank.No的最大值可以找到用户的最近一次交易

一旦获取了这个最大记录,即最近的事务被提取,他们的相关数据需要从其他表中获取

如何以最有效的方式完成这项工作。

  

1.myTransTable(字段Rank.No(自动增量字段),名称,RecNum,uname,日期,类型)

     

2.myMasterTable1(RecNum,Recowner,recdate)

     

3.MymyMasterTable2(uName,年龄,地址,联系人号码)

我尝试了这些方法来选择最大记录并从其他表中获取关联数据

  
      
  1. 将记录最大化为视图,并使用普通查询从其他表中获取数据
  2.   
  3. 最大记录和关联数据本身作为视图并根据需要选择数据
  4.   

哪种方法有最短的执行时间?

我的查询是找到最大值的最佳方式。

选项一

select a.`RecNum`,a.`Name`,a.`Date`, a.`type`"+
            "from myTransTable a "+
            "INNER JOIN "+
            "(SELECT RecNumMAX(`Rank.No`) AS maxserialnum FROM myTransTable "+
            "GROUP BY RecNumMAX)groupedRecNumMAX "+
            " ON "+
            " a.RecNum = groupedPWO.RecNum  "+
            "AND "+
            "a.`Rank.No`  = groupedRecNumMAX.maxserialnum "+

选项二

Select a.`RecNum`,a.`Name`,a.`Date`, a.`type`"+` 
FROM                   from myTransTable a

WHERE                    s.`RecNum` in(select MAX(`RecNum`)
       from               myTransTable 
       group by       RecNum)

1 个答案:

答案 0 :(得分:0)

这只是一个建议adn与您的第一个查询相关..似乎包含对表名和列名的错误引用

找你的代码你应该使用这样的查询

select a.`RecNum`
    ,a.`Name`
    ,a.`Date`
    , a.`type`
  from myTransTable a 
  INNER JOIN   (
      SELECT RecNum, MAX(`Rank.No`) AS maxserialnum 
      FROM myTransTable 
      GROUP BY RecNum 
  )  g ON  a.RecNum =g.RecNum  AND  a.`Rank.No`  = g..maxserialnum 

并且在RecNum上使用正确的索引..并且Rank.No应该是最高效的(您可以通过正确的解释和正确的执行测试来检查)

你不应该使用带有点分隔名称的列名作为Rank.No ..使用Rank_No isteand,对于列名称,首选小写不是,而不是UpperOrLower案例的混合使用下划线来代替单词< / em>的