- Wirtualizacja (1)
- Nowości (6)
- Bezpieczeństwo (3)
- Projekty (2)
- Ciekawostki (1)
- Sprzęt (1)
- Linux (1)
INTERSECT w MySQL - część wspólna zbiorów
Kodując ostatnio , chyba ze zmęczenia napotkałem na dość dziwną potrzebę. Problem trywialny, pojawił się przy implementacji wyszukiwarki. Chodziło o wyznaczenie części wspólnej zbiorów. Po krótkim googlowaniu wyszło, MySQL nie ma INTERSECT, ale czy to oznacza że nie można w nim tego zrealizować ?
Da się oczywiście, dość długo mi zajęło aby wpaść na ten pomysł. Może dlatego że proste pomysły są najtrudniejsze do wymyślenia. Podaję gotowe rozwiązanie.
SELECT DISTINCT c_id FROM `c_services` WHERE `service_id` =1 AND value LIKE '%'
AND c_id IN ( SELECT DISTINCT c_id FROM `c_services` WHERE `service_id` =2 AND value LIKE '%'
AND c_id IN ( ... ) ) ..
Dynamicznie generując w dowolnym języku programowania zapytanie SQL które parokrotnie się zagnieżdża , jesteśmy w stanie rozwiązać problem naszej zaawansowanej wyszukiwarki. Rozwiązanie problemu szukania części wspólnej chociażby 10 zbiorów jest proste i przyjemne. Algorytm ma do Siebie to że jeżeli już na początkowym etapie działania nie znajdzie części wspólnych początkowych zbiorów, to całe dalsze poszukiwanie nie ma sensu :-)