Group_concat e LEFT_JOIN problema - Non tutte le righe restituite
-
11-09-2019 - |
Domanda
Diciamo che il mio schema DB è la seguente:
T_PRODUCT
id_product (int, primary)
two entries: (id_product =1) , (id_product =2)
T_USER
id_user (int, primary)
id_product (int, foreign key)
name_user (varchar)
two entries: (id_product=1,name_user='John') , (id_product=1,name_user='Mike')
Se corro una prima query per ottenere tutti i prodotti con i loro utenti (se ce ne sono), ottengo questo:
SELECT T_PRODUCT.id_product, T_USER.name_user
FROM T_PRODUCT
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product;
>>
id_product name_user
1 John
1 Mike
2 NULL
Sembra buono con me. Ora, se voglio la stessa cosa, tranne che mi piacerebbe avere un prodotto per linea, con i nomi utente concatenati (se ci sono gli utenti, altrimenti NULL):
SELECT T_PRODUCT.id_product, GROUP_CONCAT(T_USER.name_user)
FROM T_PRODUCT
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product;
>>
id_product name_user
1 John,Mike
**expected output**:
id_product name_user
1 John,Mike
2 NULL
Se non ci sono gli utenti per un prodotto, il group_concat impedisce mysql dalla produzione di una linea di questo prodotto, anche se c'è un LEFT JOIN .
- Si tratta di un comportamento previsto MySQL?
- C'è un modo ho potuto ottenere i risultati attesi utilizzando group_concat o un'altra funzione?
Soluzione
Ah, trovato la mia risposta:
Non si dovrebbe mai dimenticare il GROUP BY clausola quando si lavora con group_concat .
Mi mancava GROUP BY T_PRODUCT.id_product
nella mia seconda query.
Lascio la questione nel caso qualcuno è così distratto come sono.
Modifica :
questa risposta , ho pensato che può anche attivare la modalità di SQL ONLY_FULL_GROUP_BY
per forzare MySQL per gettare un errore nel caso in cui il GROUP BY è mancante o errato.
Altri suggerimenti
In alternativa, è possibile utilizzare una sottoquery, proprio banco di prova per le prestazioni
SELECT
T_PRODUCT.id_product,
(SELECT GROUP_CONCAT(T_USER.name_user)
FROM T_USER
WHERE T_USER.id_product = T_PRODUCT.id_product
)
FROM T_PRODUCT