• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SQL, łączenie INNER JOIN wartości z wartością w tablicy JSON

Object Storage Arubacloud
0 głosów
251 wizyt
pytanie zadane 10 marca 2023 w SQL, bazy danych przez Toquek Nowicjusz (120 p.)

Cześć, od kilku dni próbuję rozwiązać problem z łączeniem tabel. Otóż jedna z tabel w SQLu (możemy ją nazwać 'events', przechowuje informacje o wydarzeniu, jej dacie, szczegółach itp.) zawiera kolumnę z id klientów, tylko jest ona przechowywana jako tablica JSON. Uczestników dla danego wydarzenia z tabeli 'events' może być >=1 dlatego nie mogę przypisać po prostu do jednego wydarzenia jednego id uczestnika. I teraz mam tabelę 'clients', która przechowuje dane personalne uczestników.

Pisząc zapytanie wyszukujące konkretne wydarzenie z tabeli 'events' i łącząc je z danymi kilentów z tabeli 'clients' pojawia się problem. INNER JOIN łączy po konkretnej wartości, ale czy da się zrobić, aby wypisało dane wydarzenie, jeśli jakieś id klienta tylko znajduje się w danej tabelce.

Taki byłby mniej więcej mój tok rozumowania:

SELECT * FROM events INNER JOIN clients ON clients.client_id = events.client_id

lub

SELECT * FROM events INNER JOIN clients ON clients.client_id = IN JSON_ARRAY(events .client_id)

Znalazłem na necie różne funkcje do JSONa typu json_value(), albo openjson(), ale niezbyt rozwiązywały mój problem.

W teorii mogę wybrać wszystkie wydarzenia które spełniają tam jakieś warunki i w php pobrać kolumnę z tablicą id klientów i za pomocą json_decode() odszyfrować i dać drugie zapytanie z danymi osób po tych wartościach, ale chcę zrobić wyszukiwarkę wydarzeń po imieniu i/lub nazwisku ludzi którzy biorą udział.

Coś takiego mniej więcej:

SELECT * FROM events INNER JOIN clients (jakieś warunki połączenia) WHERE concat(clients.name, ' ', clients.last_name) LIKE '%$input%';

Wiem, że LIKE jest średni do wyszukiwania po tekstach, ale w tej sytuacji jest to nieistotne.

 

Skracając myśl w wyszukiwarce wpisuję imię i nazwisko osoby, a program wyszukuje mi wydarzenia, na których ten uczestnik był. W wynikach w jednej z komórek, może być np. lista wszystkich uczestników lub coś podobnego.

Ma ktoś może pomysł jak taki problem rozwiązać?

 

PS. funkcja JSON_CONTAINS() działa fajnie, ale tylko w klauzuli WHERE

PS.2 Ewentualnie jak ktoś ma inny pomysł jak przechowywać kilka wartości do jednego wpisu w bazie

1
komentarz 10 marca 2023 przez Wiciorny Ekspert (269,710 p.)
JSON_ARRAY(events .client_id)

to Ci zwróci ID: jako json_array ... 

Może exist i select jako subquery?
https://www.sqlservertutorial.net/sql-server-basics/sql-server-exists/

komentarz 10 marca 2023 przez Toquek Nowicjusz (120 p.)

ok dzięki, lekka pomoc się przydała, jeszcze chwilę poszukałem na stackoverflow i znalazłem składnię z CAST(). Tam co prawda mieli ....CAST(client_id AS JSON)...  co nie działało, zamiast tego użyłem JSON_ARRAY(clients.client_id) i ostatecznie takie coś pomogło:

SELECT
    *
FROM
    events
WHERE
    JSON_CONTAINS(
        events.client_id,
        (
        SELECT
            JSON_ARRAY(clients.client_id)
        FROM
            clients
        WHERE clients.name
            = 'SZUKANE'
    ),
    '$'
    );
komentarz 10 marca 2023 przez Toquek Nowicjusz (120 p.)
A tylko, teraz sypie błędem, gdy wpisana fraza pasuje do więcej niż jednego wiersza w tabeli 'clients'...

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 260 wizyt
pytanie zadane 11 kwietnia 2018 w SQL, bazy danych przez Anoonymous Obywatel (1,560 p.)
+1 głos
1 odpowiedź 109 wizyt
pytanie zadane 13 maja 2022 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 16 stycznia 2018 w SQL, bazy danych przez ThreeG Nowicjusz (170 p.)

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...