【问题标题】:Not able to get data by subQueries (multiple subQueries with no direct relation)无法通过子查询获取数据(没有直接关系的多个子查询)
【发布时间】:2014-03-24 08:35:50
【问题描述】:

我想从包含以下字段的 user_login 表中获取数据:

user_login : id、状态、日期、user_id

在这个表中status可以是1或者2

如果状态为 1,则登录,否则退出。

我想在一行中获取登录和注销这两个详细信息,为此我尝试了以下查询:

select login.date, logout.date from 
(select date from user_login where userId = 1 and status = 1 and date = now()) login, 
(select date from user_login where userId = 1 and status = 2 and date = now()) logout.

当登录和注销都有数据时,我会得到数据。但我也希望只有登录有数据但没有注销。

请帮我解决这个问题。

【问题讨论】:

    标签: mysql sql subquery


    【解决方案1】:

    使用LEFT JOIN。像这样:

    select login.date, logout.date 
    from 
        (
            select 
                userId,
                date 
            from 
                user_login where userId = 1 and status = 1 and date = now()
        ) 
            login
    LEFT JOIN
        (
            select 
                date,
                userId 
            from 
                user_login 
            where
                status = 2 
                and date = now()
        ) logout
            ON logout.userId=login.userId
    

    或者我认为更好的解决方案是这样做:

    SELECT
        user_login.userId,
        MAX(CASE WHEN user_login.status=1 THEN date ELSE NULL END) AS loginDate,
        MAX(CASE WHEN user_login.status=2 THEN date ELSE NULL END) AS logoutDate,
    FROM
        user_login
    WHERE
        user_login.userId=1
        AND date = now()
    GROUP BY
        user_login.userId
    

    【讨论】:

    • 我之前尝试过但没有获取数据,因为我没有使用 MAX()。你能告诉我为什么我们需要使用 MAX()。是的,谢谢你的两个查询都很好,第二个更好
    • 因为您必须为状态 = 1 的第一行和状态 = 2 的第一行。如果您使用 max,那么您将只选择同时具有状态 1 和状态 2 的最大值的行。
    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 2019-05-11
    • 2022-01-08
    • 1970-01-01
    • 2011-06-27
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多