Запрос GROUP BY в SQL дает синтаксическую ошибку при использовании с Order By - PullRequest
1 голос
/ 09 апреля 2020

У меня есть этот запрос:

SELECT customer.cus_id,customer.fname,customer.lname,customer.image, message.message ,message.msg_id,message.from_cus,message.to_cus, message.sent_time
FROM customer 
INNER JOIN message ON cus_id=message.from_cus OR cus_id=message.to_cus
WHERE customer.cus_id IN ( 31,26)
AND   (
from_cus =25
OR to_cus = 25
)
AND customer.cus_id NOT IN(25)
ORDER BY    message.sent_time DESC
GROUP BY customer.cus_id ;

, где 31, 26 - cus_id клиентов, чьи последние сообщения я хочу получить. Я получаю все сообщения, отсортированные в соответствии с временем между 1 и ( 31,26) клиент, если я снимаю ограничение GROUP BY. Но добавление этого дает мне эту синтаксическую ошибку

[Error code:1064 SQL state:42000] 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 'GROUP BY customer.cus_id' at line 11

Я отключил режим ONLY_FULL_GROUP_BY SQL. Тем не менее, я не знаю, как получить последнее сообщение.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Это не операции агрегирования, это операции фильтрации.

Использование оконных функций:

SELECT cm.* FROM (
        SELECT customer.cus_id,customer.fname,customer.lname,customer.image, message.message ,message.msg_id,message.from_cus,message.to_cus, message.sent_time,
        ROW_NUMBER() OVER (PARTITION BY customer.cus_id ORDER BY message.sent_time DESC) as seqnum
        FROM customer 
        INNER JOIN message ON cus_id=message.from_cus OR cus_id=message.to_cus
        WHERE customer.cus_id IN ( 31,26)
        AND   (
        from_cus =25
        OR to_cus = 25
        )
        AND customer.cus_id NOT IN(25)
    ) cm 
WHERE seqnum = 1
ORDER BY msg_id DESC;
2 голосов
/ 09 апреля 2020

Group by предложение будет до order by предложение

SELECT customer.cus_id,customer.fname,customer.lname,customer.image, message.message ,message.msg_id,message.from_cus,message.to_cus, message.sent_time
FROM customer 
INNER JOIN message ON cus_id=message.from_cus OR cus_id=message.to_cus
WHERE customer.cus_id IN ( 31,26)
AND   (
from_cus =25
OR to_cus = 25
)
AND customer.cus_id NOT IN(25)
GROUP BY customer.cus_id 
ORDER BY message.msg_id DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...