2016-05-01 9 views
1

Ich erhalte diese Fehlermeldung:SQL-Fehler mit einem CTE

Abfragefehler: Sie haben einen Fehler in der SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MariaDB-Serverversion für die richtige Syntax entspricht, die in der Nähe von '; WIT Convs AS (wählen Sie c.id, c.title, c.seen, c.id_receiver, c.id_send' in Zeile 1

wenn ich diese Abfrage:

$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); 

ich bin etwas fehlt Ihre Hilfe sehr geschätzt werden würde

PS: i. minimiert die Abfrage für diesen Zusammenhang ist es einfach zu machen, wenn Sie mir helfen Finden Sie die Lösung, ich habe vielleicht ein anderes Problem mit der vollständigen Abfrage. Also könnte ich Ihnen für weitere Hilfe zurückkommen. Vielen Dank im Voraus.

EDIT (GANZ QUERY)

$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"; 

Was mich CTE zu verwenden geschoben, ist die Notwendigkeit von Alias-Namen in where-Klausel verwenden. Und wie Sie sehen können, habe ich viele von ihnen.

Können Sie mir ein Beispiel für die Verwendung von Sichten/temporären Tabellen geben, um meinen Zweck zu erreichen?

+0

Ich denke, wir order by-Klausel fehlen. Du hast direkt Desc geschrieben. –

+0

@I_am_Batman in meinem tatsächlichen Code, es ist vorhanden, aber immer noch nicht funktioniert. Ich habe es hier einfach vertippt (ich habe die Frage bearbeitet). – codeless

+0

Ist das immer noch ein Tippfehler, den Sie nach Bestellung nicht mit einem Spaltennamen versehen haben? –

Antwort

2

CTEs sind ganz ähnlich wie 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 
+0

Ich bin froh, dass es eine andere Möglichkeit gibt, es in MySQL zu tun. Jedoch habe ich jetzt diesen Fehler: 'Query Error: Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das zu Ihrer MariaDB-Server-Version für die richtige Syntax zu verwenden in der Nähe von Gesprächen c) als convs wo gelöscht = 0 und (id_ 'bei Zeile 11' – codeless

+0

jetzt funktioniert es wie ein Charme, danke für Ihre sehr nützliche Antwort Das Problem war das Komma nach dem Alias ​​gelöscht: 'wie gelöscht,' – codeless

4

MySQL/MariaDB unterstützt keine CTEs. Außerdem ist es völlig unnötig in diesem Fall:

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

Hinweis: Sie müssen die Spalte für die order by auch angeben.

Für komplexere Beispiele können Sie Unterabfragen, Sichten und/oder temporäre Tabellen verwenden.

+1

Wusste nicht, dass MySQL/MariaDB keine CTEs unterstützt. Und Sie haben Recht, in diesem ** minimized ** Fall ist es nutzlos. Meine eigentliche Abfrage ist jedoch komplexer. schaue Schnitt Abschnitt in meiner Frage. – codeless