创建包含具有条件的唯一行的新表; MySQL的

时间:2017-03-30 09:10:48

标签: mysql sql

我有一个包含以下列的表:

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工作台崩溃(超时执行查询),我不知道它是否有效。

示例数据:

enter image description here

你能想到一个更轻松的查询来运行它吗?

也许更好的方法是:

  1. 采取行动的所有行" a"或行动" b":
  2. SELECT * FROM test1 WHERE ActionName =" a"或ActionName =" b&#34 ;;

    1. 仅基于SessionID删除重复项(无论时间顺序)
    2. 想法?

2 个答案:

答案 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子句