2015-01-02 3 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 

Таким образом, это будет ПРИСОЕДИНЕНИЕ ПО 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 last_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.
  • Запросы легче отслеживать, если псевдонимы таблиц являются сокращенными таблицами.
Смежные вопросы