【问题标题】:MySQL Intersect Query on One Table一个表上的 MySQL 相交查询
【发布时间】:2013-07-07 08:59:19
【问题描述】:

我有一个包含用户事件信息的表,即每一行都包含一个 ID、用户的开始日期、完成日期和事件编号。示例:

第 1 行:ID 256 |开始日期 13360500 |完成日期 13390500 |事件编号 3

我正在尝试为已完成事件 3 和 2 的用户交叉所有行,但我无法弄清楚为什么我的查询没有返回任何结果:

SELECT table_id FROM table
    WHERE table_EventNum = 3 
    AND table_FinishDate > 0

    AND table_id IN (SELECT table_id FROM table WHERE table_EventNum = 2);

这个没有子查询的查询(在底部与其余的行分开)返回一堆非空结果,因为它应该,子查询也返回一堆非空结果(再次,因为它应该)。但是由于某种原因,复合查询根本不返回任何行。我知道IN 命令在任一侧的表达式为 NULL 时返回 NULL,但由于两个查询都返回结果,我不确定还有什么可能导致这种情况。

有什么想法吗?谢谢!

【问题讨论】:

    标签: mysql sql sqlcommand intersect


    【解决方案1】:

    当事件未完成时,假设 FinishDate 为 NULL。还假设必须有一行匹配 id 和事件编号 2,并且事件 3 不能在事件 2 之前发生:

    SELECT t1.table_id FROM table t1 INNER JOIN table t2 ON t1.table_id = t2.table_id
        WHERE t1.table_EventNum = 3 AND t2.table_EventNum = 2
        AND NOT t1.table_FinishDate IS NULL
    

    请注意,除了您不需要子查询这一事实之外,我找不到您的查询有任何问题。

    【讨论】:

    • 我只选择 table_id 而不是 FinishDate 和 table_id 有什么不同吗?我以为 MySQL 会先执行 SELECT 操作,然后执行 IN (ID's) 命令?
    • SELECT table_id, FinishDate FROM table WHERE table_EventNum = 3 AND table_FinishDate > 0 AND table_id IN (SELECT table_id FROM table WHERE table_EventNum = 2); -- 应该没问题,没区别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多