2016-03-25 14 views
8

ho provato il 3.x CakePHP "Bookmaker Tutorial" e ho seguito le istruzioni passo per passo. Purtroppo, alla fine del primo capitolo ottengo l'errore allegato:Errore di sintassi o violazione di accesso: 1055 Espressione # 8 della lista SELECT non è nella clausola GROUP BY e contiene colonna nonaggregated

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 

Inoltre, ottengo le informazioni per controllare la mia tabella "BookmarksTags", ma non ho a creat uno prima. Sono un po 'confuso.

Please try correcting the issue for the following table aliases: 

BookmarksTags 

ho già google il mio problema e ho trovato le informazioni per aggiornare il "my.cnf" con una linea supplementare. Ho già provato ma non è successo niente. Ho anche controllato l'ortografia e scaricato "bookmarker-tutorial" da github ma ho ancora ricevuto questo errore sopra.

Uso MySQL 5.7.11 e PHP 5.6.14.

risposta

17

Questa è una novità di MySQL 5.7 e indica che la query è ambigua.

Si consideri la seguente tabella:

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

Se avete fatto la seguente query:

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

Poi la colonna name viene utilizzato per il raggruppamento. Si noti che age potrebbe avere più valori, quindi è "non aggregato". Devi fare qualcosa per abbattere quei valori.

Il comportamento in 5.6 e precedente era sceglierne solo il primo seconda ordinamento, anche se questo è a volte imprevedibile e fallirebbe. In 5.7 ti stanno impedendo di farlo in primo luogo.

La soluzione qui è di raggruppare anche quella, o di applicare un operatore aggregato come MIN() ad esso.

+0

C'è un modo per ottenere solo il primo indipendentemente dall'ordinamento? – rotaercz

+0

@rotaercz Senza selezionare il concetto stesso di "primo" non ha senso. – tadman

+0

Quello che voglio dire è, c'è un modo per ottenere le righe indipendentemente? GROUP BY funzionava bene per quello che avevo prima di MySQL 5.7. Non aveva a che fare con l'ambiguità e in molte circostanze non importava a seconda di ciò che veniva recuperato. – rotaercz

1

Appena inciampato sullo stesso problema.
Un modo semplice per rendere il tutorial "lavoro" senza modificare la query potrebbe essere quella di ripristinare sql_mode in config/app.php:

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

Mentre questo dovrebbe fa funzionare le cose, probabilmente non è raccomandato nei casi di vita reale.

4

Sto usando Laravel 5.4 e ho riscontrato lo stesso problema.
cerco di impostare strict in false su config/database.php e funziona.

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

Tuttavia è meglio modificare query SQL di sopprimere è di avvertimento.

0

questo può essere il problema relativo alla versione più recente di MySQL come hai detto che si sta utilizzando MySQL 5.7.11 Quindi, per risolvere questo problema per tutti i siti vedono questo

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

la risposta da parte della comunità per aggiungere la riga sotto

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

nel file di /etc/mysql/my.cnf & risparmio essa; e dopo il riavvio del server

sudo service mysql restart 

farebbe il lavoro

0

Oltre al commento di Tadman, per esercitazione si sta seguendo, si dovrebbe gruppo SQL query di selezione sia Bookmarks.id e BookmarksTags.tag_id, invece di appena Bookmarks.id

Per fare che, nel file di BookmarksTable.php, linea

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

dovrebbe essere simile

->distinct(['Bookmarks.id', 'BookmarksTags.tag_id']) 
Problemi correlati