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

SELECT na relacji wiele do wielu

Object Storage Arubacloud
0 głosów
1,114 wizyt
pytanie zadane 23 września 2019 w SQL, bazy danych przez Klik Obywatel (1,540 p.)
edycja 23 września 2019 przez Klik

Witam. Mam oto problem tego typu że próbuję zrobić selecat z wykorzystaniem relacji "many to many".

Mam tabelę places i categories oraz tabelę places_has_categories  gdzie znajduję się powiązania dla poprzednich tabel.

Dany "place" może być przypisany do wielu kategorii i dana "category" może mieć wiele "places".

Moje zapytanie obecnie wygląda tak:

SELECT * FROM places p
                    JOIN places_has_categories phc on p.id = phc.place_id
                    JOIN categories c on c.id = phc.category_id

tabela "places"

id | name | active | description

tabela "categories"

id | name |

tabela "places_has_categories"

id | place_id | category_id

Oczekiwany rezultat:

 [
            [
              'id',
              'name',
              'active',
              'description',
              'categories' => [
                  ['id','name'],
                  ['id','name'],
                  ['id','name']
              ],
            ],
              [
              'id',
              'name',
              'active',
              'description',
              'categories' => [
                  ['id','name'],
                  ['id','name'],
                  ['id','name']
              ]
            ]
        ]

 

Niestety nie działa to tak jak bym chciał. Dostaję coś na kształt listy "places_has_categories" z dopisanymi wartosciami z tabeli "places".

Chciałbym jako wynik uzyskać listę "places" i dla każdego "place" przypisaną listę kategorii.

Jak coś takiego mogę uzyskać

Dziękuję

komentarz 23 września 2019 przez Chess Szeryf (76,710 p.)
Czy mógłbyś wrzucić po cztery wiersze z każdej tabeli i wyszczególnić jaki rezultat ma powstać z tychże rekordów.
komentarz 23 września 2019 przez adrian17 Ekspert (344,860 p.)
(Na moje oko, to zapytanie wygląda poprawnie.)
komentarz 23 września 2019 przez Klik Obywatel (1,540 p.)
Zaktualizowane pytanie.

1 odpowiedź

0 głosów
odpowiedź 23 września 2019 przez adrian17 Ekspert (344,860 p.)

Oczekiwany rezultat:

Nie, SQL Ci czegoś takiego nie dostarczy. Tak to nie działa.

Z takiego joina dostaniesz tyle wierszy, ile jest pasujących `places_has_categories`. Z tego możesz sobie samemu zrobić pętlę i zbudować listę list jak chcesz.

komentarz 23 września 2019 przez Klik Obywatel (1,540 p.)
Serio? Widać z długo w mongo siedziałem. :(

Dzięki
komentarz 23 września 2019 przez adrian17 Ekspert (344,860 p.)
SQL zwraca Ci proste płaskie wiersze.

W niektórych bazach możesz użyć ficzerów bazy żeby zrobić to co chcesz, ale nie jest to uniwersalny SQL i może nie współgrać z prostymi bibliotekami SQLowymi które oczekują tylko "proste" wiesze.

Na przykład w Postgresie array_agg:

https://stackoverflow.com/questions/10928210/postgresql-aggregate-array

http://www.sqlfiddle.com/#!17/21b2b/1
komentarz 23 września 2019 przez Klik Obywatel (1,540 p.)
O to to, akurat w postgresie robię. Dzięki. Chyba zacznę jednak od szczegółowej lektury dokumentacji postgresa.

Podobne pytania

0 głosów
0 odpowiedzi 209 wizyt
0 głosów
1 odpowiedź 1,207 wizyt
pytanie zadane 11 czerwca 2019 w Java przez JuniorPL Użytkownik (770 p.)
0 głosów
2 odpowiedzi 1,493 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...