【发布时间】:2015-02-12 17:47:20
【问题描述】:
已阅读所有类似的 qs 但无法应用于我的 sql
想要选择所有客户和最后插入的操作记录。 下面的 sql 首先选择最大 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 提供空结果 - 但运行时间为 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 原始查询结果为:
3) 添加 LIKE 'JIM%' AND cus.surname LIKE 'HEMM%' 不会对查询时间产生太大影响,但会根据建议添加
您好 - 使用大家的想法取得了很好的结果 - 谢谢
1) 将 WHERE 更改为 cus.FirstName LIKE 'JIM%' AND 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
【问题讨论】:
-
如果将
select MAX(actionid)更改为select actionid并添加limit 1和order by desc会怎样 -
如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
-
我会先运行一个 EXPLAIN 来看看计划者想要做什么。我怀疑这是对连接字符串的(不可索引)搜索
-
第三点应该有帮助,您是否创建了“名字”和“姓氏”的索引?
标签: mysql