Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建包含具有条件的唯一行的新表;MySQL_Mysql_Sql - Fatal编程技术网

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

创建包含具有条件的唯一行的新表;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

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

SessionID-包含会话中的操作(假设每个SessionID 1-10行)

ActionName-是操作的名称

时间-时间操作发生

我需要返回一个新表,它的列是相同的,如果操作的名称是“a”或“b”,那么每个SessionID只包含1行

也就是说,我的新表每个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工作台崩溃(执行查询超时),我甚至不知道它是否有效

样本数据:

你能想出一个更轻松的查询来运行这个吗

也许更好的方法是:

  • 采取行动“a”或行动“b”的所有行:
  • 从测试1中选择*,其中ActionName=“a”或ActionName=“b”

  • 仅基于SessionID删除重复项(无论时间顺序如何)

  • 对此有何想法?

    您可以像下面这样更改您的查询。这里不需要子查询

    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-增加更多细节