Я получаю эту ошибку:
Ошибка запроса: у вас есть ошибка в синтаксисе 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 clause. И, как вы можете видеть, у меня их много.
Можете ли вы дать мне пример того, как использовать представления / временные таблицы для достижения моей цели?
CTE очень похожи на производные таблицы:
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
MySQL / MariaDB не поддерживает CTE. Кроме того, в этом случае нет необходимости:
select id, title, seen, id_receiver, id_sender from conversations c where id_receiver = '5' order by ?? desc limit 0, 25;
поselect id, title, seen, id_receiver, id_sender from conversations c where id_receiver = '5' order by ?? desc limit 0, 25;
Примечание. Вам также нужно указать столбец для order by
.
Для более сложных примеров вы можете использовать подзапросы, представления и / или временные таблицы.