【问题标题】:MYSQL SELECT WITH LEFT JOIN LIMIT 1MYSQL SELECT WITH LEFT JOIN LIMIT 1
【发布时间】:2017-06-05 12:39:40
【问题描述】:

我有一个问题: 我想选择 user1 或 user2 是特定用户 ID 的所有 babble-rooms。 (SELECT * FROM babble WHERE user1 = '$user' OR user2 = '$user')

但我还想获取 babble_messages 的最后一个条目,其中 babble ID 等于 babble_id。

我的数据库结构:

唠叨
身份证 |用户1 |用户2 |已创建

表格babble_messages
身份证 |发件人 | babble_id |创建 |见过|留言

我的尝试是:

SELECT 
    * 
FROM 
    babble
LEFT JOIN (
    SELECT
        babble_messages.ID AS last_id, 
        babble_messages.sender AS last_sender, 
        babble_messages.babble_id, 
        babble_messages.created AS last_created, 
        babble_messages.seen AS last_seen, 
        babble_messages.message AS last_message
    FROM 
        babble_messages 
    ORDER BY 
        created DESC LIMIT 1
    ) babble_messages ON 
    babble.ID = babble_messages.babble_id 
WHERE 
    user1 = '$user' OR user2 = '$user' 
ORDER BY 
    last_created DESC

这将为 LEFT JOIN 表输出空条目。我认为这是因为我在子查询中选择了 babble_messages 的最后一个条目...... 我试图在子查询中添加一个 WHERE 标记,但这会引发错误:

SELECT 
    * 
FROM 
    babble
LEFT JOIN (
    SELECT
        babble_messages.ID AS last_id, 
        babble_messages.sender AS last_sender, 
        babble_messages.babble_id, 
        babble_messages.created AS last_created, 
        babble_messages.seen AS last_seen, 
        babble_messages.message AS last_message
    FROM 
        babble_messages 
    WHERE 
        babble.ID = babble_messages.babble_id* 
    ORDER BY 
        created DESC 
    LIMIT 
        1
    ) babble_messages ON 
    babble.ID = babble_messages.babble_id 
WHERE 
    user1 = '$user' OR user2 = '$user' 
ORDER BY 
    last_created DESC

在子查询中 mysql 不知道“babble.ID”。 如何只选择 babble_messages 的最后一个条目?

当然我可以使用多个请求,但我只想发出一个请求,因为它更快。

我希望这是足够的信息。 :D 感谢阅读并希望回答:)

祝你有个愉快的一天

【问题讨论】:

标签: php mysql select left-join limit


【解决方案1】:

如果用户数量很大,尤其是在其中使用 OR 时,这可能会有点慢。

SELECT
    ID
    ,user1
    ,user2
    ,created
    ,last_id
    ,last_sender
    ,babble_id
    ,last_created
    ,last_seen
    ,last_message
FROM
(
    SELECT
        ID
        ,user1
        ,user2
        ,created
        ,(SELECT ID FROM babble_messages WHERE babble_ID = user1 ORDER BY created DESC LIMIT 1) AS babble_message_id
    FROM babble
    WHERE user1 = 1
) a
LEFT JOIN (
    SELECT 
        ID last_id
        ,sender last_sender
        ,babble_id
        ,created last_created
        ,seen last_seen
        ,message last_message
    FROM babble_messages
) b ON a.babble_message_id = b.last_id
ORDER BY last_created DESC

【讨论】:

  • 这会抛出:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 7 行的“last_sender, ,babble_id, ,last_created, ,last_seen, ,last_messag”附近使用正确的语法
  • 多了几个逗号。
  • Mysql 不知道 on 子句中的列“babble.babble_message_id”:#1054 - Unknown column 'babble.babble_message_id' in 'on Clause'
  • 我觉得我在为你编码。我修复了错误。我没有运行它就写了这个,因为我没有数据集......
  • 很抱歉让您想为我编码。但我想知道为什么这会引发错误...谢谢!
【解决方案2】:

尝试在您的 mysql 查询中使用表实例,例如 babble bbabble_message bm

SELECT 
   b.* 
FROM 
   babble b
LEFT JOIN (
    SELECT
       bm.ID AS last_id, 
       bm.sender AS last_sender, 
       bm.babble_id, 
       bm.created AS last_created, 
       bm.seen AS last_seen, 
       bm.message AS last_message
    FROM 
       babble_messages bm
    WHERE 
       b.ID = bm.babble_id
    ORDER BY 
       created DESC 
    LIMIT 
       1
    ) bm ON 
    b.ID = bm.babble_id 
  WHERE 
    user1 = '$user' OR user2 = '$user' 
  ORDER BY 
    last_created DESC

我希望这对你有帮助。

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2021-08-01
    相关资源
    最近更新 更多