Ecco lo scenario. Come utilizzare REGEXP
per simulare l'operatore IN
fino a corrispondere a tutti i valori nel lato sinistro all'interno del lato destro indipendentemente dall'ordine delle stringhe in entrambi i lati. È possibile ottenere anche la soluzione ANSI SQL
utilizzando join sinistro e sottocategorie.REGEXP per abbinare una stringa di gruppo all'interno di un altro elenco di gruppi indipendentemente dall'ordine - SQL
tabella di esempio:
Parent table, Child table, Parent_Child
. Per non prendere più spazio sulla domanda, inserisco qui solo un reulst di Group_Concat Child query by Parent
.
PID NAME CHILDREN
1 dad john dave,jill,lina
2 mum sandy maryam,jack
3 dad frank henry,jill
4 mum kate maryam
5 mum jean dave
Risultato previsto: Selezionare genitore che ha loro tutti i bambini hanno partecipato a qualcosa.
PID NAME CHILDRENREXGEX
3 dad frank jill,henry
4 mum kate maryam
5 mum jean dave
ecco la soluzione REGEXP SQL: ora il problema qui, non restituisce risultati corretti se l'ordine lato sinistro/squence non corrisponde lato destro.
Query:
select
x.pid, x.name, x.children as childrenRexgex
from
(select
p.pid, p.name, group_concat(c.name) as children
from
parent as p
inner join
parent_child as pc on p.pid = pc.pid
join
child as c on pc.cid = c.cid
group by
p.pid
order by
c.name) as x
where
'dave,maryam,jill,henry' REGEXP x.children
;
Quindi ci sono due aspetti Apprezzerei per la domanda:
- Qual è il modello migliore per abbinare tutti i nomi a sinistra per l'elenco definito dall'utente del diritto lato indipendentemente dall'ordine?
- Quale potrebbe essere la prestazione ottenuta utilizzando
REGEXP
?
Il vero problema qui è che i bambini non dovrebbero essere una colonna separata da virgola, ma dovrebbero essere una tabella di dettaglio. Vedi questa domanda: [La memorizzazione di un elenco delimitato in una colonna di database è davvero così brutta?] (Http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column- davvero-che-male) –