Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tabele referencyjne i relacje many-to-many
Forum PHP.pl > Forum > Bazy danych > MySQL
maciej.m
Witam,

Mam problem, z którym już pewnie się spotkaliście. Otóż dla dwóch tabel: a i b stworzyłem tabelę referencyjną x. W tabeli b ma się tak do tabeli a, że każdemu rekordowi z a może odpowiadać jeden lub kilka rekordów z b. Do określenia tej relacji służy tabela x, która zawiera pary a.id i b.id. Praktyczne zastosowanie tej struktury ma wyglądać tak, że przy wyciąganiu rekordów z tabeli a, do każdego takiego rekordu powinno być przyporządkowane jeden lub więcej rekordów z b. Pytanie w jaki sposób to praktycznie zrobić, żeby było jak najbardziej optymalnie i wydajnie.

Dla tego przykładu teraz mógłbym wykonać jedno zapytanie:
  1. SELECT * FROM `x` LEFT JOIN `a` ON (a.id = x.a_id) LEFT JOIN `b` ON (b.id = x.b_id);


Takie zapytanie oczywiście dawałoby mi zduplikowane rekordy z `a` z różną wartością pól dołączonych z `b`.

Mógłbym też wyciągać pojedyncze rekordy z `a` i dla każdego z nich stosować osobne zapytanie o pary, w których występuje z `b`

Czy macie na to jakieś praktyczne rozwiązanie?

--
Pozdrawiam
MM
darko
select distinct
nospor
to zapytanie jest bez sensu, bo jesli dla a nie bedzie przypisanego zadnego b, to nie wyciągnie ci tych a. No chyba ze o to ci wlasnie chodzilo.
Jesli nie o to, to zapytanie powinno wygladac tak:
  1. SELECT * FROM `a` LEFT JOIN `x` ON (a.id = x.a_id) LEFT JOIN `b` ON (b.id = x.b_id);


A w czym problem masz teraz? Jesli chodzi ci o grupowanie to:
http://nospor.pl/grupowanie-wynikow-n35.html
maciej.m
Rzeczywiście, zapytanie lepsze. Tyle, że wyciąga mi zduplikowane rekordy w sytuacji jeżeli występuje wiele par pojedynczego `a` z różnymi `b`. Nie wiem jak to się ma do wydajności.
Załóżmy, że `a` to `pracownicy` a `b` to ich `pozytywne_cechy`. Teraz chcemy wyciągnąć listę pracowników i przy każdym zobaczyć listę ich pozytywnych cech.
Czy obrabianie takich danych powinno się odbyć na poziomie PHP po otrzymaniu wyników podanego zapytania, czy też na poziomie SQL z zastosowaniem jakiegoś sprytnego zapytania.

--
Pozdrawiam
MM

Jak by wyglądało takie zapytanie z SELECT DISTINCT?
nospor
Cytat
Tyle, że wyciąga mi zduplikowane rekordy w sytuacji jeżeli występuje wiele par pojedynczego `a` z różnymi `b`.
zgadza sie, jest to naturalna sytuacja dla takich relacji.

Cytat
Czy obrabianie takich danych powinno się odbyć na poziomie PHP po otrzymaniu wyników podanego zapytania, czy też na poziomie SQL z zastosowaniem jakiegoś sprytnego zapytania.
W linku co ci dalem w poprzednim poscie masz opisane oba przypadki: obrobka w php i obrobka w mysql (uzycie GROUP_CONCAT)

Cytat
Jak by wyglądało takie zapytanie z SELECT DISTINCT?
DISTINCT sluzy czemu innemu i tu sie nie sprawdzi.
maciej.m
Ok, spróbowałem na podstawie tego postu skonstruować jakieś zapytanie, ale nie bangla: wyciąga jeden rekord ze zduplikowaną zawartością nowego pola. Oto zapytanie:

  1. SELECT GROUP_CONCAT( b.nazwa
  2. ORDER BY b.name ASC
  3. SEPARATOR ';;;' ) grupa, a. *
  4. FROM a
  5. LEFT JOIN x ON ( a.id = x.a_id )
  6. LEFT JOIN b ON ( b.id = x.b_id )
  7. LIMIT 0 , 30
nospor
funkcje GROUP_CONCAT stosuje sie razem z GROUP BY ktorego ty nie raczyles dodac smile.gif
maciej.m
No pięknie. Gra.

Całe moje zapytanie wygląda teraz tak (dodałem też WHERE)

  1. SELECT GROUP_CONCAT( b.nazwa
  2. ORDER BY b.name ASC
  3. SEPARATOR ';;;' ) grupa, a. *
  4. FROM a
  5. LEFT JOIN x ON ( a.id = x.a_id )
  6. LEFT JOIN b ON ( b.id = x.b_id )
  7. WHERE a.id = 51
  8. GROUP BY a.id
  9. ORDER BY a.nazwa ASC
  10. LIMIT 0 , 30


Stokrotne Dzięki
MM
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.