MYSQL SELECT 具有左连接限制 1

MYSQL SELECT WITH LEFT JOIN LIMIT 1

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

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

我的数据库结构:

Table babble:
ID | user1 | user2 | created

Table babble_messages:
ID | sender | babble_id | created | seen | message

我的尝试是:

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 table 输出空条目。我认为发生这种情况是因为我 select 在子查询中只是 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"。 我怎样才能 select 只是 babble_messages 的最后一个条目?

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

我希望这些信息足够了。 :D 感谢阅读并希望能回答 :)

hadome 祝你有愉快的一天

如果用户数量很大,这可能会有点慢,尤其是在有 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

尝试在您的 mysql 查询中使用 table 实例,例如 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

希望对您有所帮助。