2016-04-27 14 views
5

Ho una tabella in cui i salvare per ogni record i suoi antenatiGroup da una stringa con delimitatore

+----+------------+ 
| id | ancestors | 
+----+------------+ 
| 1 | ,1,  | 
| 2 | ,2,  | 
| 3 | ,3,1,  | 
| 4 | ,4,2,  | 
| 5 | ,5,3,1, | 
| 6 | ,6,4,2, | 
| 7 | ,7,5,3,1, | 
+----+------------+ 

Come gruppo da id ma, come in questo modo group by ','id',' e non group by id per ottenere un risultato simile a questo:

+----+------------+ 
| id | count  | 
+----+------------+ 
| 1 | 4   | 
| 2 | 3   | 
| 3 | 3   | 
| 4 | 2   | 
| 5 | 2   | 
| 6 | 1   | 
| 7 | 1   | 
+----+------------+ 

Il mio requisito è trovare il conteggio dello id nell'intera colonna di ancestors.

+0

Fornire ulteriori dettagli: dettagli dello schema, struttura/dettagli della tabella, query completa utilizzata. Un SQLFiddle sarebbe molto meglio, ovviamente! – SarathChandra

+0

Questa è una violazione delle regole di base della normalizzazione. La tabella degli antenati deve avere più righe con un valore atomico per l'antenato. Supponendo che tu abbia 2 genitori, avresti massimo 2 righe. Anche il tuo esempio non sembra avere senso. Per l'ID 1, hai 1 come antenato? Perché? Non sei il tuo genitore. – gview

+0

@gview seguendo sempre le regole di normalizzazione non è sempre la scelta migliore solo essere carfull e scegliere la soluzione che si adatta al tuo problema .. nel mio caso non riesco a fare una query per trovare tutta la discesa di un record se io rispetto normalizzazione – Youssef

risposta

1

Il tuo requisito sembra essere quello di trovare il count del id nell'intera colonna di ancestors.

Quindi, l'utilizzo COUNT in una sottoquery dipendente dovrebbe andare bene, come qui sotto:

SELECT a.id, 
(SELECT count(*) FROM ancestors_table t where t.ancestors LIKE CONCAT('%,',a.id,',%')) 
    FROM ancestors_table a; 

lavoro SQLFiddle here.

UPDATE: Corretto il problema per due cifre o più cifre. 1 corrisponderà solo a 1. Non 10, 11, ecc. Ciò è possibile perché la colonna aggiunge , attorno a ciascun valore.

+0

Sì, questo è il mio requisito, ma per quanto riguarda le prestazioni e l'operatore 'concat' o' REGEXP'? – Youssef

+1

Ciò restituirà risultati errati non appena si dispone di due cifre o più cifre. 1 corrisponderà non solo 1 ma 10, 11 ecc. – Quassnoi

+0

@Quassnoi con l'operazione 'concat' è più veloce di' FIND_IN_SET'? – Youssef

6
SELECT m1.id, COUNT(*) 
FROM mytable m1 
JOIN mytable m2 
ON  FIND_IN_SET(m1.id, m2.ancestors) 
GROUP BY 
     m1.id 

Si noti che non è un metodo efficiente e diventerà più lento man mano che il database aumenta.

+0

grazie man ma non ho capito la funzione 'FIND_IN_SET' e la uso su un metodo di ricerca temo che rallenti la richiesta .. anche questo funziona su' jpa' o 'hibenrate'? – Youssef

+1

Sì, come ho già detto questa funzione non è indicizzabile. Funzionerà in qualsiasi sistema in grado di inviare questa query a MySQL.Si potrebbe migliorare questo usando l'indicizzazione 'FULLTEXT', ma' MATCH' sfortunatamente non funziona in una condizione di join in MySQL. – Quassnoi

Problemi correlati