Oto scenariusz. Jak wykorzystać REGEXP
do symulowania operatora IN
jeszcze do pasuje do wszystkich wartości po lewej stronie po prawej stronie, niezależnie od kolejności ciągów po obu stronach. Również rozwiązanie ANSI SQL
może zostać osiągnięte za pomocą lewostronnego połączenia i podrzędnych zapytań.REGEXP, aby dopasować ciąg grupy w obrębie innej listy grup bez względu na kolejność - SQL
stół próbki:
Parent table, Child table, Parent_Child
. Aby nie zajmować więcej miejsca w tym pytaniu, zamieszczam tutaj tylko numer 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
Oczekiwany wynik: Wybierz rodzica, który ma swoje wszystkie dzieci uczestniczyły w czymś.
PID NAME CHILDRENREXGEX
3 dad frank jill,henry
4 mum kate maryam
5 mum jean dave
Oto rozwiązanie REGEXP SQL: teraz problem tutaj, to nie zwraca poprawne wyniki, jeśli zamówienie lewa strona/squence nie pasuje do prawej strony.
Zapytanie:
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
;
Stąd istnieją dwa aspekty Byłbym wdzięczny za to pytanie:
- Jaki jest najlepszy wzorzec dopasować wszystkie nazwy w lewym boku do listy zdefiniowanych przez użytkownika prawa strona bez względu na kolejność?
- Jaka może być wydajność uzyskana za pomocą
REGEXP
?
Prawdziwy problem polega na tym, że dzieci nie powinny być kolumną z oddzielonymi przecinkami, ale powinny być tabelą szczegółów. Zobacz to pytanie: [Czy przechowywanie ograniczonej listy w kolumnie bazy danych jest naprawdę złe?] (Http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column- naprawdę-tak-źle) –