Jak wybrać zaznaczone miasta z zaznaczonego województwa?

0

Mam tabelę z usługami jakie oferuje użytkownik

nazwa: services_users

id id_user service_symbol
1 16 drugs
2 832 sex
3 4873 guns

Teraz taki użytkownik zaznacza sobie w jakim mieście lub jakim województwie oferuje usługi. jest do tego tabela kolejna i ma ona takie pola

nazwa: services_locations

id services_user_id location_symbol value
1 1 provinces_kupo 1
1 1 provinces_pors 0
1 2 cities_torn 1
1 3 cities_torn 1

W tabeli powyżej usługi o ID 1 są oferowane w całym kujawsko-pomorskim
Jest tez osoba która oferuje takie usługi tylko w Toruniu

Osoba, która szuka usług może zaznaczyć miasto lub województwo. Powiedzmy, że zaznaczyła że ma pokazać wszystkich ludzi z województwa kujawsko-pomorskiego. Jak wyszukać i pokazać tych którzy zaznaczyli np Toruń?

Mam trzecią tabele

nazwa: location_links

id symbol parent_symbol
1 countries_pl null
2 provinces_kupo countries_pl
3 provinces_pors countries_pl
4 cities_torn provinces_kupo

Na razie wymyśliłem takie zapytanie i utknąłem

SELECT DISTINCT su.id, su.services_symbol, sl.*
FROM services_users su
LEFT JOIN services_locations sl ON sl.services_users_id = su.id
WHERE sl.location_symbol = 'provinces_kupo' AND sl.value = 1
1
SELECT su.id
FROM services_users su
WHERE EXISTS (SELECT 1 
                FROM services_locations
               WHERE services_locations.services_users_id = su.id
                     AND services_locations.value = 1 
                     AND services_locations.location_symbol = 'user_selection')
      OR EXISTS (SELECT 1 
                   FROM location_links
                   JOIN services_locations
                     ON location_links.symbol = services_locations.location_symbol 
                        AND services_locations.services_users_id = su.id
                        AND services_locations.value = 1 
                  WHERE parent_symbol = 'user_selection')
      OR EXISTS (SELECT 1 
                   FROM location_links ll_1
                   JOIN location_links ll_2
                     ON ll_1.symbol = ll_2.parent_symbol
                   JOIN services_locations
                     ON ll_2.symbol = services_locations.location_symbol 
                        AND services_locations.services_users_id = su.id
                        AND services_locations.value = 1 
                  WHERE ll_1.parent_symbol = 'user_selection')


Tak wstępnie, brzydko i bez testu, ale chyba o to chodzi. To przy założeniu 3 poziomów zagnieżdżeń: kraj - województwo - miasto.
Jeśli liczba poziomów nie jest zdefiniowana, to szukałbym zapytań hierarchicznych, jeśli stała, to coś a'la:

with locations as
( select symbol
    from location_links
   where location_links.symbol = 'user_selection'
 union
 select symbol
    from location_links
   where location_links.parent_symbol = 'user_selection'
 union
 select symbol
   from location_links ll_1
   join location_links ll_2
(...)
  
)

select distinct services_user_id
from services_locations
join locations
  on services_locations.symbol = locations.symbol
     and services_locations.value = 1
0

@Los Bomberos: Dziękuje, powiem ci ze błądziłem i poszedłem w innym kierunku. Coś ku ostatnbiemu z DISTINCT ale nie osiągnąłem celu. Zagnieżdzenie poziomów jest stałe właśnie do trzech poziomów. Kraj -> Dzielnica -> Miasto Jeszcze raz dziękuje za pomoc. Jesteś Genialny

1 użytkowników online, w tym zalogowanych: 0, gości: 1