创建包含具有条件的唯一行的新表;MySQL
我有一个包含以下列的表: SessionID-包含会话中的操作(假设每个SessionID 1-10行) ActionName-是操作的名称 时间-时间操作发生 我需要返回一个新表,它的列是相同的,如果操作的名称是“a”或“b”,那么每个SessionID只包含1行 也就是说,我的新表每个SessionID应该有一行,其中包含动作“a”或“b” 我试过:创建包含具有条件的唯一行的新表;MySQL,mysql,sql,Mysql,Sql,我有一个包含以下列的表: SessionID-包含会话中的操作(假设每个SessionID 1-10行) ActionName-是操作的名称 时间-时间操作发生 我需要返回一个新表,它的列是相同的,如果操作的名称是“a”或“b”,那么每个SessionID只包含1行 也就是说,我的新表每个SessionID应该有一行,其中包含动作“a”或“b” 我试过: CREATE TABLE U_SessionID ( SELECT DISTINCT(SessionID) AS SessionID FROM
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 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;
会话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)使用GROUPBY子句。我真的不喜欢这个想法,因为虽然它可能会起作用,但它可能不会起作用,这取决于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
如果您想要一个更能证明未来的简单解决方案,请使用我的第二个解决方案并删除组中的ORDER BY子句_CONCAT您的
on
子句,我想您能给我们提供示例数据和预期结果吗?@Jens补充道,感谢您在查询中只引用了一个示例数据中的两个表吗?请在评论中添加ddl牙链;这也需要很长时间。你能看一下我的编辑吗?谢谢你的评论;我想尝试一种更轻的方法,如上面的编辑所述。我希望你能再看一眼。Thanks@Mariah-增加更多细节