我有一个包含以下列的表:
SessionID - 包含会话中的操作(每个SessionID 1-10行)“
ActionName - 是操作的名称
发生时间 -
我需要返回一个新表,其列相同,每个SessionID只包含1行,如果操作的名称是" a"或" b"。
也就是说,我的新表每个SessionID应该有一行,其中包含动作" a"或" b"。
我试过了:
CREATE TABLE U_SessionID (
SELECT DISTINCT(SessionID) AS SessionID FROM test1)
;
我将唯一会话复制到新表
SELECT U_SessionID.SessionID, test1.ActionName, test1.SessionID
FROM test1
INNER JOIN U_SessionID ON (SELECT SessionID
FROM test1
WHERE U_SessionID.SessionID = test1.SessionID AND (ActionName =
"a" OR ActionName = "b")
ORDER BY Time DESC
LIMIT 1);
但是这段代码导致MySQL工作台崩溃(超时执行查询),我不知道它是否有效。
示例数据:
你能想到一个更轻松的查询来运行它吗?
也许更好的方法是:
SELECT * FROM test1 WHERE ActionName =" a"或ActionName =" b&#34 ;;
想法?
答案 0 :(得分:0)
您可以像下面一样更改查询。这里不需要你的子查询。
SELECT U_SessionID.SessionID, test1.ActionName, test1.SessionID
FROM test1
INNER JOIN U_SessionID ON U_SessionID.SessionID = test1.SessionID
WHERE ActionName IN ("a" , "b")
ORDER BY `Time` DESC
LIMIT 1;
答案 1 :(得分:0)
会话ID的时间是唯一的吗?
若然: -
SELECT U_SessionID.SessionID, test1.ActionName, test1.SessionID
FROM test1
INNER JOIN
(
SELECT SessionID
MAX(Time) AS MaxTime
FROM test1
WHERE ActionName IN ("a", "b")
GROUP BY SessionID
) sub0
ON test1.SessionID = sub0.SessionID
INNER JOIN U_SessionID
ON sub0.SessionID = U_SessionID.SessionID
AND sub0.MaxTime = U_SessionID.Time
如果时间不是唯一的,但假设表中有一个名为id的唯一列: -
SELECT U_SessionID.SessionID, test1.ActionName, test1.SessionID
FROM test1
INNER JOIN
(
SELECT SessionID
SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY Time DESC), ',', 1) AS MaxId
FROM test1
WHERE ActionName IN ("a", "b")
GROUP BY SessionID
) sub0
ON test1.SessionID = sub0.SessionID
INNER JOIN U_SessionID
ON sub0.SessionID = U_SessionID.SessionID
AND sub0.MaxId = U_SessionID.id
修改
如果您只想要每个会话ID的随机记录,那么您可以(ab)使用GROUP BY子句。我真的不喜欢这个想法,因为它可能确实有效,但根据MySQL数据库的配置,它可能无法正常工作,即使它确实有效,也有人可能会做一个停止工作的更新。即便如此,如果它仍然有效,那么它就不会带回一个真正的记录,而不是一行,它们的列是来自不同行的列的混合。
所以请放在这里以获得完整性,并为您提供一个选项,但我强烈建议不要使用它
SELECT U_SessionID.SessionID, test1.ActionName, test1.SessionID
FROM test1
INNER JOIN U_SessionID ON U_SessionID.SessionID = test1.SessionID
WHERE ActionName IN ("a" , "b")
GROUP BY U_SessionID.SessionID
如果您想要一个更加面向未来的简单解决方案,那么请使用我的第二个解决方案并删除GROUP_CONCAT中的ORDER BY子句