我有一个包含以下列的表格:
SessionID - 包含 session 中的操作(假设每个 SessionID 1-10 行)
ActionName - 是操作的名称
时间 - 发生操作的时间
如果操作的名称是“a”或“b”,我需要返回一个新表,其列相同,并且每个 SessionID 仅包含 1 行。
也就是说,我的新表的每个 SessionID 应该有 1 行,其中包含操作“a”或“b”。
我尝试过:
CREATE TABLE U_SessionID (
SELECT DISTINCT(SessionID) AS SessionID FROM test1)
;
我将唯一 session 复制到新表
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工作台崩溃(执行查询超时),我不知道它是否有效。
示例数据:
你能想出一个更简单的查询来运行这个吗?
也许更好的方法是:
- 使用操作“a”或操作“b”获取所有行:
SELECT * FROM test1 WHERE ActionName = "a"OR ActionName = "b";
- 仅根据 SessionID 删除重复项(无论时间顺序如何)
有什么想法吗?
最佳答案
session 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
编辑
如果您只想为每个 session 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
如果您想要一个更面向 future 的简单解决方案,请使用我的第二个解决方案并删除 GROUP_CONCAT 中的 ORDER BY 子句
关于mysql - 创建包含具有条件的唯一行的新表; MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43113327/