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

标签 mysql sql

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

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

示例数据:

enter image description here

你能想出一个更简单的查询来运行这个吗?

也许更好的方法是:

  1. 使用操作“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/

    相关文章:

    php - 如何显示2个不同日期范围的数据

    python - Sqlalchemy orm 根据给定输入动态查询过滤

    sql - MSSQL 上的 WHERE 子句中的 CASE 语法

    c# - 使用 Epplus 在 C# 中对 Excel 进行 SQL 查询

    mysql - 具有关系表的关系数据库模型?

    php - 如何使用 Eloquent 和 MySQL 按 last id 对分组结果进行排序?

    mysql - ER_NON_UNIQ_ERROR以及如何正确设计表

    php mysql 查询类似(包含)

    php - SQL-如果不为空,则选择不同表中的列

    sql - 基于一列中的值跨组更改另一列中的值