• 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

Cloud VPS
0 głosów
480 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 (281,450 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 442 wizyt
pytanie zadane 11 kwietnia 2018 w SQL, bazy danych przez Anoonymous Obywatel (1,560 p.)
+1 głos
1 odpowiedź 164 wizyt
pytanie zadane 13 maja 2022 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 211 wizyt
pytanie zadane 16 stycznia 2018 w SQL, bazy danych przez ThreeG Nowicjusz (170 p.)

93,456 zapytań

142,451 odpowiedzi

322,721 komentarzy

62,837 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

Kursy INF.02 i INF.03
...