选择子查询中的最后一条记录

时间:2015-02-12 17:47:20

标签: mysql

已阅读所有类似的qs,但无法应用于我的sql

想要选择所有客户并插入最后一个操作记录。 下面的sql首先选择max actionid,然后在另一个子查询中使用它 - 这需要5 +秒才能运行;(

请告知TQ

SELECT cus.cusid,cus.FirstName,cus.Surname,
       lastact.actionid, lastact.actiondate, lastact.siteid
FROM cus 
    LEFT JOIN(
        SELECT MAX(actionid) AS maxactionid, cusid
        FROM `action`
        INNER JOIN `event` ON event.eventid = action.`eventid`
        GROUP BY cusid
    ) AS maxactionid ON maxactionid.cusid = cus.cusid
    LEFT JOIN (
    SELECT 
    action.actionid,
    action.actiondate,
    event.cusid,
    event.siteid 
    FROM
      `action` 
      INNER JOIN `event` 
        ON event.eventid = action.eventid 
    ORDER BY actionid DESC
    ) AS lastact ON lastact.actionid = maxactionid 
WHERE UCASE(CONCAT(firstname, surname)) LIKE '%JIM%HEMM%'

想法的TQ - 请参阅以下内容:

1)限制的想法,为lastact.actionid,lastact.actiondate,lastact.siteid提供了null结果 - 但确实在0.075秒内运行! 遗憾的是,这个想法失败了

SELECT cus.cusid,cus.FirstName,cus.Surname, lastact.actionid, lastact.actiondate, lastact.siteid 
FROM cus 
LEFT JOIN (SELECT action.actionid, action.actiondate, event.cusid, event.siteid 
FROM action 
INNER JOIN event ON event.eventid = action.eventid 
ORDER BY actionid DESC LIMIT 1 
) AS lastact ON lastact.cusid = cus.cusid 
WHERE UCASE(CONCAT(firstname, surname)) LIKE '%JIM%HEMM%' 

2)原始查询的EXPLAIN结果为:

Explain results for orig query

3)添加LIKE' JIM%'和cus.surname LIKE' HEMM%'不会对查询时间产生太大影响,但会根据建议

包含

嗨 - 通过使用每个人的想法获得了很好的结果 - 谢谢

1)改变了哪里有cus.FirstName LIKE' JIM%'和cus.surname LIKE' H%'

2)在姓氏,姓氏

上添加了索引

3)在行动表中添加了cusid(不再需要事件表)

4)在动作子查询

之外移动查找表(不是原始问题)

完成的sql看起来像(在0.063秒内运行 - 用只有一个字母的姓氏测试!)

SELECT cus.cusid,cus.FirstName,cus.Surname, lastact.actionid, lastact.actiondate, lastact.siteid, actiontype.action,
FROM cus 
LEFT JOIN (
    SELECT action.actionid, action.actiondate, event.cusid, event.siteid 
    FROM action  
    ORDER BY actionid DESC
) AS lastact ON lastact.cusid = cus.cusid
LEFT JOIN actiontype ON actiontype.actiontypeid = lastact.typeid 
WHERE cus.FirstName LIKE 'JIM%' AND cus.surname LIKE 'H%'
GROUP BY lastact.cusid  

1 个答案:

答案 0 :(得分:0)

  • 正如JC Sama所说“通过select actionid更改选择MAX(actionid)并添加限制1并按desc排序”,有助于索引 searchs。
  • 正如David K-J所说“首先运行一个EXPLAIN以查看规划者正在尝试做什么。我怀疑它是连接字符串上的(不可索引的)搜索”。
  • 在比较时,你不应该在字符串的开头放置jokers'%',这会禁用索引搜索。
  • 你不应该在比较时使用函数(至少可以避免使用它们),也可以用于索引搜索。
  • 现在您可以使用索引,如果尚未添加它们,请添加它们。
  • 我可能在这里错了,但就我而言,我没有看到最后一次LEFT JOIN的意义。您可以从第一个LEFT JOIN中撤消该数据。你不是为什么要用cusid分组。

总而言之,我制作的sql(显然没有经过测试,你可能需要修复一些东西):

SELECT cus.cusid,cus.FirstName,cus.Surname,
maxaction.actionid, maxaction.actiondate, maxaction.siteid
FROM cus 
LEFT JOIN(
    SELECT actionid AS maxaction, action.actiondate, event.cusid, event.siteid
    FROM `action`
    INNER JOIN `event` ON event.eventid = action.eventid
    order by actionid desc limit 1
) AS maxaction ON maxaction.cusid = cus.cusid
WHERE cus.FirstName like 'JIM%' and cus.surname like 'HEMM%'