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 .

  1. Si tratta di un comportamento previsto MySQL?
  2. C'è un modo ho potuto ottenere i risultati attesi utilizzando group_concat o un'altra funzione?
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top