2016-03-25 13 views
8

Ich habe das CakePHP 3.x "Bookmaker Tutorial" ausprobiert und die Anweisungen Schritt für Schritt befolgt. Leider bekommen, am Ende des ersten Kapitels i den beigefügten Fehler:Syntaxfehler oder Zugriffsverletzung: 1055 Ausdruck Nr. 8 der SELECT-Liste ist nicht in der GROUP BY-Klausel und enthält nicht aggregierte Spalte

Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #8 of SELECT list 
is not in GROUP BY clause and contains nonaggregated column 'wis.Tags.id' which is not 
functionally dependent on columns in GROUP BY clause; this is incompatible with 
sql_mode=only_full_group_by 

Des Weiteren ich die Informationen erhalten, meine „BookmarksTags“ Tabelle zu überprüfen, aber ich muss, bevor man nicht creat. Ich bin ein bisschen verwirrt.

Ich google bereits mein Problem und ich fand Informationen, um die "my.cnf" mit einer zusätzlichen Zeile zu aktualisieren. Ich versuche es schon, aber nichts passiert. Ich überprüfe auch die Rechtschreibung und lade das "bookmarker-tutorial" von github herunter, aber ich erhalte immer noch diesen Fehler oben.

Ich benutze MySQL 5.7.11 und PHP 5.6.14.

Antwort

17

Dies ist eine neue Sache in MySQL 5.7 und ist eine Warnung, dass Ihre Abfrage nicht eindeutig ist.

Betrachten Sie die folgende Tabelle:

id | name | age | points 
-------------------------------------------- 
1   Bob   21   1 
2   James  14   1 
3   Bob   21   3 
4   James  14   2 
5   Casey  17   3 

Wenn Sie die folgende Abfrage haben:

SELECT name, age, SUM(points) FROM scores GROUP BY name 

Dann wird die name Spalte für die Gruppierung verwendet wird. Beachten Sie, dass age mehrere Werte haben kann, also "nicht aggregiert" ist. Sie müssen etwas tun, um diese Werte zu reduzieren.

Das Verhalten in 5.6 und vorherigen war, nur die erste je nach Sortierreihenfolge zu wählen, obwohl dies manchmal unvorhersehbar war und würde fehlschlagen. In 5.7 verhindern sie, dass Sie es überhaupt machen.

Die Lösung hier ist auch, darauf zu gruppieren, oder einen Aggregatoperator wie MIN() darauf anzuwenden.

+0

Gibt es eine Möglichkeit, die erste unabhängig von der Sortierreihenfolge zu bekommen? – rotaercz

+0

@rotaercz Ohne zu sortieren ist das Konzept von "first" bedeutungslos. – tadman

+0

Was ich meine ist, gibt es eine Möglichkeit, die Zeilen unabhängig zu bekommen? GROUP BY funktionierte gut für das, was ich vor MySQL 5.7 hatte. Es ging nicht um die Zweideutigkeit, und in vielen Fällen spielte es keine Rolle, was abgerufen wurde. – rotaercz

1

Gerade stolperte über das gleiche Problem.
Ein einfacher Weg, um das Tutorial „Arbeit“ ohne Änderung der Abfrage zu machen sein könnte sql_mode in config/app.php zurück:

'Datasources' => [ 
    'default' => [ 
     'className' => 'Cake\Database\Connection', 
     'driver' => 'Cake\Database\Driver\Mysql', 
     'persistent' => false, 
     'host' => 'localhost', 
     ... 
     'init' => ["SET sql_mode = ''"], 
    ], 

Während dies sollte macht die Dinge funktionieren, wird es wahrscheinlich nicht zu empfehlen im wirklichen Leben Fälle.

4

Ich benutze Laravel 5.4 und konfrontiert dasselbe Problem.
Ich versuche strict in false auf config/database.php einzustellen und es funktioniert.

'connections' => [ 
    'mysql' => [ 
     'strict' => false, 
    ] 
] 

es ist jedoch besser SQL-Abfrage zu bearbeiten als unterdrücken es warnt.

0

Dies könnte das Problem mit einer neueren Version von MySQL sein, wie Sie sagten, dass Sie MySQL 5.7 verwenden.11 So, dieses Problem zu lösen für alle Websites, diese durch Gemeinschaft

https://craftcms.stackexchange.com/questions/12084/getting-this-sql-error-group-by-incompatible-with-sql-mode-only-full-group-by/13662#13662

die Antwort finden Sie in der Zeile unter

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 

in /etc/mysql/my.cnf Datei hinzufügen & Speichern es; und nach dem Neustart des Servers

sudo service mysql restart 

Würde die Arbeit

0

Neben Tadman Kommentar zum Tutorial folgen, sollten Sie Ihre Gruppe SQL-SELECT-Abfrage sowohl Bookmarks.id und BookmarksTags.tag_id statt von nur Bookmarks.id

Um das zu tun, in BookmarksTable.php Datei, Zeile

->distinct(['Bookmarks.id']) 

wie

aussehen sollte
->distinct(['Bookmarks.id', 'BookmarksTags.tag_id']) 
Verwandte Themen