2015-01-02 55 views
0

这是我第一次看到这样一个复杂的查询。以下是查询,我需要加入profile_id另一个名为“配置文件”的表。我如何加入另一个表到这个查询

表结构

enter image description here

原始查询

SELECT a.* 
    FROM messages a 
    INNER JOIN 
    (
     SELECT message_replay_id, MAX(message_id) AS latest_message 
     FROM messages 
     WHERE message_from = '1' || message_to = '1' 
     GROUP BY message_replay_id 
    ) b 
    ON a.message_replay_id = b.message_replay_id 
    AND a.message_id = b.latest_message 
    ORDER BY a.message_id DESC 

所以,这将加入ON message_to = PROFILE_ID

这是我在我目前尝试

SELECT a.* FROM messages a 
    INNER JOIN(SELECT message_replay_id, MAX(message_id) AS latest_message FROM messages WHERE message_from = '1' || message_to = '1' GROUP BY message_replay_id) b 
    ON a.message_replay_id = b.message_replay_id AND a.message_id = b.latest_message 
    INNER JOIN(SELECT * AS latest_profile FROM PROFILES WHERE profile_id = b.latest_message) c 
    ON a.message_replay_id = b.message_replay_id AND a.message_id = b.latest_message 
ORDER BY a.message_id DESC 

错误信息

Error Code: 1064 
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS latest_profile FROM profiles WHERE profile_id = b.latest_message) c 
    ON a.m' at line 4 

帮助我的家伙,我怎么会加入另一个表。

+2

提供适当的DDL您的表定义 –

+1

扩展@ MKhalidJunaid的点...考虑下列行为这种简单的两步过程:1.如果您还没有这样做,提供适当的DDL(和/或sqlfiddle ),这样我们就可以更容易地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry

+0

'SELECT * AS latest_profile'没有意义。 'AS'用于给'SELECT'列表中的表或单列赋予一个别名。你不能给'*'别名。另外,你的第二个'ON'子句应该在'c'子查询中引用一些东西。 – Barmar

回答

1

您不能在from子句中的子查询中引用表别名。相反:

SELECT m.* 
FROM messages m INNER JOIN 
    (SELECT message_replay_id, MAX(message_id) AS latest_message 
     FROM messages 
     WHERE message_from = '1' || message_to = '1' 
     GROUP BY message_replay_id 
    ) mm 
    ON m.message_replay_id = mm.message_replay_id AND 
     m.message_id = mm.latest_message INNER JOIN 
    profiles p 
    ON p.profile_id = mm.latest_message 
ORDER BY mm.message_id DESC; 

另外:

  • 不当as*(一般)。它只能重命名一列。
  • 您不需要重复前两个表格之间的join条件。
  • profiles的子查询是不必要的,会影响MySQL的性能。
  • 如果表别名是表缩写,查询更容易遵循。
相关问题