Domanda

Ho un database MySQL in cui ogni utente ha un account, e ogni account può avere più autorizzazioni.

Il mio obiettivo finale è quello di finire con il nome utente dell'account, e un elenco delimitato da virgole di autorizzazioni ID. Ci sono due modi posso ottenere questo risultato:

SELECT a.username, GROUP_CONCAT(rp.permission_id) as permission_ids
FROM account AS a
JOIN role_permission AS rp
ON rp.role_id = a.role_id
WHERE a.id = 1902

... o ...

SELECT username
FROM account
WHERE id = 1902;

SELECT permission_id
FROM account_permission
WHERE account_id = 1902

Con la singola query, ottengo i miei risultati esattamente come li voglio. Con due domande, devo creare l'elenco delimitato da virgole in app (PHP) utilizzando il secondo set di risultati.

Ci sono motivi di prestazioni di non scegliere la prima opzione? Non ho mai usato group_concat prima, quindi non so le implicazioni di esso, le prestazioni-saggio.

È stato utile?

Soluzione

Le prestazioni dovrebbero essere OK - meglio di due query. È necessario essere consapevoli del fatto che la lunghezza è limitata però:

  

Il risultato viene troncato alla lunghezza massima che è dato dalla group_concat_max_len variabile di sistema, che ha un valore predefinito di 1024. il valore può essere impostato superiore, sebbene la lunghezza massima effettiva del valore di ritorno è vincolata dal valore di max_allowed_packet. La sintassi per modificare il valore di group_concat_max_len in fase di esecuzione è il seguente, dove val è un numero intero senza segno:

SET [GLOBAL | SESSION] group_concat_max_len = val;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top