【问题标题】:How to make a 1 column query by choosing from two columns mysql如何通过从两列mysql中选择来进行1列查询
【发布时间】:2012-06-25 18:28:00
【问题描述】:

我有一个消息系统(非常基本),它有一个这样的表:

**MESSAGE_ID**  **RUSER_ID**    **SUSER_ID**    **MESSAGE_DATA**    **DATE**

RUSER 是接收用户,SUSER 是发送用户。如果我想输出一个会输出某些用户消息的查询,我目前会这样做:

从 PRIVATE_MESG 中选择 *,其中 RUSER_ID=$USER_ID 或 SUSER_ID=$USER_ID

这将为我提供与该 USER_ID 关联的所有 message_id。我想要的是创建一个仅生成与 RUSER_ID 关联的 ID 或与特定用户关联的 SUSER_ID 的列。我需要它来选择 RUSER_ID 或 SUSER_ID 等于 USER_ID 但只显示不是 USER_ID

的消息>

然后我想根据该查询的输出进行分组。

非常感谢任何帮助!

谢谢!

更新我并不是真的在寻找 message_id,我只是在寻找该人写信或收到的用户列表。

更新 众所周知,我完美地收到了这个问题的答案!我稍后对其进行了调整,以便它也可以按日期从最新到最旧显示它们。我通过使用 DATE() 和 TIME() 函数将 DATETIME 拆分为 DATE 和 TIME 来做到这一点。这是我的最终查询:

    SELECT
    IF(RUSER_ID = $USER, SUSER_ID, RUSER_ID) as THE_OTHER_GUY, DATE(DATE) as DAY, TIME(DATE) as TIME
    FROM PRIVATE_MESG
    WHERE RUSER_ID = $USER
OR SUSER_ID = $USER;
group by THE_OTHER_GUY ORDER BY DAY DESC, TIME DESC

希望这对下一个人有帮助!

【问题讨论】:

    标签: mysql nested-queries


    【解决方案1】:

    您可以查询:

    SELECT
        *,
        IF(RUSER_ID = $USER_ID, SUSER_ID, RUSER_ID) as THE_OTHER_GUY
    FROM PRIVATE_MESG
    WHERE RUSER_ID = $USER_ID
        OR SUSER_ID = $USER_ID;
    

    【讨论】:

    • 确实有效!你知道哪一个会更有效率吗? if 还是 union?
    • 如果您在 RUSER_ID 和 SUSER_ID 上有索引,联合可能会更有效,但如果您想计算其他一些列,它可能会变得非常冗长:)
    • 我是一名初级程序员(18 岁),所以我把索引这个术语松散地放在周围,并不是 100% 确定描述它们的最佳方式。这两列确实链接回另一个表 (USER_ACCOUNTS)。这是否意味着它们是索引?另外,您的回答确实帮助我更多地了解了 mysql...谢谢!
    • 如果你明确地将它们设计为 FOREIGN KEYS,那么 MySQL 也会创建一个 INDEX。该文档在 FOREIGN KEYS 和 INDEX 上非常好:)
    【解决方案2】:
    SELECT SUSER_ID FROM PRIVATE_MESG WHERE RUSER_ID=$USER_ID
    UNION
    SELECT RUSER_ID FROM PRIVATE_MESG WHERE SUSER_ID=$USER_ID
    

    它检索:
    - 向 $USER_ID 发送消息的用户 ID 列表
    - 从 $USER_ID 接收消息的用户 ID 列表

    UNION 将 2 个列表分组到一个结果集中。

    【讨论】:

    • Concat 不将它们结合起来吗?例如,如果 RUSER=11 和 SUSER=12 它看起来像这样: 1112 ?我没有尝试 group_concat 只是因为我认为它会像 Concat 感谢您的快速响应!
    • 不完全是,因为我并不是真的在寻找 message_id,因为我只是该人写信或接收的用户列表。
    • 确实有效!你知道哪一个会更有效率吗? if 还是 union?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多