【问题标题】:Best Way to form this query形成此查询的最佳方式
【发布时间】:2018-08-30 03:57:50
【问题描述】:

团队,

我有三张桌子。

myTransTable,myMasterTable 1, MymyMasterTable 2

myTransTable 有很多条目 'Rank.No' 的自动增量字段是为了识别单个记录。 'U.Name' 保存用户名。每个用户在这个表中可以有多条记录。但是用户最近的交易可以通过'U.Name'分组后Rank.No的最大值找到

一旦获取此最大记录,即最近的事务,它们的关联数据需要从其他表中获取

如何以最有效的方式做到这一点。

1.myTransTable(fields Rank.No(auto increment field),Name,RecNum,uname,date,type)

2.myMasterTable1 (RecNum,Recowner,recdate)

3.MymyMasterTable2 (uName,age,address,contact num)

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

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

哪种方法可以缩短执行时间?

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

选项一

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)

【问题讨论】:

  • 取决于执行计划..
  • 您的第一个查询语法错误.. ?? RecNumMAX(Rank.No)??

标签: mysql sql


【解决方案1】:

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

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

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 并且对于列名,首选小写而不是大写或小写的混合使用下划线代替单词

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    相关资源
    最近更新 更多