2017-06-05 4 views
0

ich eine Abfrage ausgeführt wird, aber wenn ich es ausführen, gibt es einPHP SQLSTATE [42000] Syntaxfehler oder Zugriffsverletzung: 1064 in Abfrage

SQLSTATE[42000]: Syntax error or access violation: 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 ' count(distinct exams.user_id) as count_user_mhs from `users` where `users.type`' at line 1 (SQL: select `universities`.`name`, count(distinct exams.user_id) as count_user_dsn from `users` where `users.type` = 0, count(distinct exams.user_id) as count_user_mhs from `users` where `users.type` = 1, count(exams.subject_id) as count_subject, sum(exams.score) as count_score, TIME_FORMAT(SUM(TIMEDIFF(exams.exam_end_date, exams.exam_start_date)), "%H:%i:%s") as count_time from `exams` inner join `universities` on `universities`.`id` = `exams`.`university_id` inner join `users` on `users`.`id` = `exams`.`user_id` where exists (select * from `universities` where `exams`.`university_id` = `universities`.`id`) group by `user_id` order by `count_score` desc, `count_time` asc)

$exams = Exam::join('universities', 'universities.id', '=', 'exams.university_id') 
       ->join('users', 'users.id', '=', 'exams.user_id') 
       ->select('universities.name',DB::raw('count(distinct exams.user_id) as count_user_dsn from `users` where `users.type` = 0'),DB::raw('count(distinct exams.user_id) as count_user_mhs from `users` where `users.type` = 1'),DB::raw('count(exams.subject_id) as count_subject'),DB::raw('sum(exams.score) as count_score'),DB::raw('TIME_FORMAT(SUM(TIMEDIFF(exams.exam_end_date, exams.exam_start_date)), "%H:%i:%s") as count_time')); 

Kann jemand helfen? Ich vermute, es hat etwas mit dem Ausdruck DB::raw zu tun. Aber ich weiß nicht genau, was falsch ist.

+0

1) Dies ist keine Warnung, dies ist ein Fehler. 2) Du hast die ganze Fehlermeldung nicht kopiert, daher wissen wir nicht einmal, was schief gegangen ist. 3) Sie haben das sql query laravel, das aus Ihrem Code erstellt wurde, nicht geteilt. Dies würde auch helfen, den Fehler zu identifizieren. Aber diese Unterabfragen mit den Zählungen im rohen SQL-Teil sehen falsch aus. 4) Es würde auch helfen, wenn Sie beschreiben, was genau Sie hier erreichen wollen. Weil wir feststellen können, wo Sie einen Fehler gemacht haben, ist es eine andere Idee, die Ihnen hilft, eine funktionierende Lösung zu erstellen. – Shadow

+0

[Weitere Informationen] (https://stackoverflow.com/questions/23515347/how-can-i-fix-mysql-error-1064). – tadman

+0

Fügen Sie die einfache Fehlermeldung ein, es hilft beim Debuggen. – BDS

Antwort

0

Ihre generierte Abfrage sieht wie folgt aus:

select 
    `universities`.`name`, 
    count(distinct exams.user_id) as count_user_dsn from `users` where `users.type` = 0, 
    count(distinct exams.user_id) as count_user_mhs from `users` where `users.type` = 1, 
    count(exams.subject_id) as count_subject, 
    sum(exams.score) as count_score, 
    TIME_FORMAT(SUM(TIMEDIFF(exams.exam_end_date, exams.exam_start_date)), "%H:%i:%s") as count_time 
from 
    `exams` 
     inner join 
    `universities` on `universities`.`id` = `exams`.`university_id` 
     inner join 
    `users` on `users`.`id` = `exams`.`user_id` 
where 
    exists (select * from `universities` where `exams`.`university_id` = `universities`.`id`) 
group by 
    `user_id` 
order by 
    `count_score` desc, 
    `count_time` asc 

Das Problem ist auf den Linien 3 und 4, die durch den DB::raw Code erzeugt werden.

Um dies zu beheben Sie benötigen, um Ihre Eloquent Abfrage wie folgt zu aktualisieren:

<?php 
$exams = Exam::join('universities', 'universities.id', '=', 'exams.university_id') 
    ->join('users', 'users.id', '=', 'exams.user_id') 
    ->select(
     'universities.name', 
     DB::raw('(select count(distinct exams.user_id) as count_user_dsn from `users` where `users.type` = 0)'), 
     DB::raw('(select count(distinct exams.user_id) as count_user_mhs from `users` where `users.type` = 1)'), 
     DB::raw('count(exams.subject_id) as count_subject'),DB::raw('sum(exams.score) as count_score'), 
     DB::raw('TIME_FORMAT(SUM(TIMEDIFF(exams.exam_end_date, exams.exam_start_date)), "%H:%i:%s") as count_time') 
    ); 

Das heißt ... Ausführen der SELECT COUNT Unterabfragen in der Haupt SELECT Aussage ist keine gute Idee, da sie für jeden ausgeführt wird Zeile, die von der Hauptabfrage ausgewählt wurde.

Verwandte Themen