MYSQL SELECT与LEFT JOIN LIMIT 1

时间:2017-06-05 12:39:41

标签: php mysql select left-join limit

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

但我也希望得到babble_messages的最后一个条目,其中babble ID等于babble_id。

我的数据库结构:

  

babble
     ID | user1 | user2 |创建

     

babble_messages
     ID |发件人| 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 感谢阅读并希望回答:)

度过美好的一天

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

尝试在mysql查询中使用表格实例,例如 babble b babble_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

我希望这可能对你有所帮助。