Ошибка SQL при использовании CTE

Я получаю эту ошибку:

Ошибка запроса: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с ‘; WITH convs AS (выберите c.id, c.title, c.seen, c.id_receiver, c.id_send’ в строке 1

когда я использую этот запрос:

$query = ";WITH convs AS (
select c.id, c.title, c.seen, c.id_receiver, c.id_sender
from conversations c
)
select id, title, seen, id_receiver, id_sender
from convs
where id_receiver = '5'
order by title desc limit 0,25";

$res = mysqli_query($connection ,$query);

Я что-то пропустил ?
Ваша помощь будет высоко ценится.

PS: я свернул запрос, чтобы сделать его простым для этого контекста. Если вы поможете мне найти решение, у меня может быть другая проблема с полным запросом. Так что я мог бы вернуться к вам за дополнительной помощью. Заранее спасибо.

РЕДАКТИРОВАТЬ (ВЕСЬ ЗАПРОС)

$query = "WITH convs AS (
select c.id, c.title, c.seen, c.id_receiver, c.id_sender,
(select max(date) from messages where id_conversation = c.id and id_user <> '$iduser') as last_msg,
(select top 1 id_user from messages where id_conversation = c.id and id_user <> '$iduser' order by date desc) as last_user,
(select count(distinct id_user) from messages where id_conversation = c.id) as nbruser,
(select count(*) from messages where id_conversation = c.id) as nbrmsg,
(select username from users where id = c.id_sender) as sender, (select username from users where id = c.id_receiver) as receiver,
(select count(*) from deleted_conversations where id_user='$iduser' and id_conversation=c.id) as deleted,
from conversations c
)
select id, title, seen, id_receiver, id_sender, receiver, sender, last_msg, last_user, deleted, nbruser, nbrmsg
from convs
where (id_receiver = '$iduser' or (id_sender == '$iduser' and nbruser > 1)) and deleted = 0
order by last_msg desc limit $pageLimit,$REC_PER_PAGE";

Что подтолкнуло меня к использованию CTE, так это необходимость использования псевдонимов в предложении where. И, как вы можете видеть, у меня их много.

Можете ли вы дать мне пример того, как использовать представления / временные таблицы для достижения моей цели?

1

Решение

CTE в достаточной степени похож на Derived Tables:

select id, title, seen, id_receiver, id_sender, receiver, sender, last_msg, last_user, deleted, nbruser, nbrmsg
FROM
(
select c.id, c.title, c.seen, c.id_receiver, c.id_sender,
(select max(date) from messages where id_conversation = c.id and id_user <> '$iduser') as last_msg,
(select top 1 id_user from messages where id_conversation = c.id and id_user <> '$iduser' order by date desc) as last_user,
(select count(distinct id_user) from messages where id_conversation = c.id) as nbruser,
(select count(*) from messages where id_conversation = c.id) as nbrmsg,
(select username from users where id = c.id_sender) as sender, (select username from users where id = c.id_receiver) as receiver,
(select count(*) from deleted_conversations where id_user='$iduser' and id_conversation=c.id) as deleted,
from conversations c
) as convs
where (id_receiver = '$iduser' or (id_sender == '$iduser' and nbruser > 1)) and deleted = 0
order by last_msg desc limit $pageLimit,$REC_PER_PAGE
2

Другие решения

MySQL / MariaDB не поддерживает CTE. Плюс, это совершенно не нужно в этом случае:

    select id, title, seen, id_receiver, id_sender
from conversations c
where id_receiver = '5'
order by ?? desc
limit 0, 25;

Примечание. Необходимо указать столбец для order by также.

Для более сложных примеров вы можете использовать подзапросы, представления и / или временные таблицы.

5