Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Wypisanie tabeli z połączeniem jeden do wielu
Forum PHP.pl > Forum > Przedszkole
Aui06
Witam

Czy ktoś z was wie jak połączyć ze sobą 2 tabele o powiązaniach jeden do wielu. Czyli 1 rekord z pierwszej tabeli jest powiązany z kilkoma z drugiej.

W pierwszej tabeli jest kilkaset wyników. Każdy musi zostać wyświetlony wraz d dodatkowymi polami.

Pola nie mogą się powtarzać a dodatkowe wartości mają zostać dopisane na końcu. Jeśli w drugiej tabeli były 3 wyniki do wypisania pierwszej dodaje 3 rekordy na końcu.

Druga tabela zawiera klucz obcy na podstawie którego można połączyć.

Próbowałam zrobić to w ten sposób

  1. $sqlla = sed_sql_query("SELECT pp_IdTowarS, tw_Id, GROUP_CONCAT(pp_Wartosc) as razem FROM tw__Towar w LEFT OUTER JOIN planer2_plus_tw_pola p on w.tw_Id=p.pp_IdTowarS
  2. WHERE w.tw_idGrupa IN (".sed_sql_prep($khfiltr).") GROUP BY pp_IdTowarS");
  3. while ($row7 = sed_sql_fetcharray($sqlla)) {
  4. $p[$row7['tw_Id']] = $row7['razem'];
  5. }
  6. foreach ($p as $key => $value) {
  7. $kategorias[$key] = implode(", ", $value);
  8. }


W efekcie tego otrzymałam stringa (aaa, 2, 1, , bbbbb, ccc). A potrzebuje zmienne na których mogła bym pracować.
Sephirus
Najlepiej będzie jesli podasz struktury tych tabelek (spis pól) oraz przykładowe wyniki jakie chciałabyś uzyskać - wtedy dopasujemy jakieś zapytanie wink.gif
Aui06
To będzie wyglądało mniej więcej tak:

Kod
tabela1 z dodatkowymi polami

lp  Nazwa  opis  dodatkowe1  dodatkowe2  dodatkowe3

1  aaa       x        5        ala         8
2  bbb       x        5        abc        7


tabela2 (zawierająca dodatkowe pola)

id  pp_Idpola  pp_idTowarS   pp_Wartosc
1      2             1          5
2     4             1          ala
3     5             1          8
4     2             2          5
5     4             2          abc
6      5             2          7


Chodzi mi o coś takiego
Sephirus
Nie do końca o to mi chodziło ale zagłębiając się w temat:

Ogólnie rozumiem, że masz chciałabyś coś na zasadzie:

id pole d1 d2 d3 .... dn
1 coś a b c .... z

Nie ma super sposobu na coś takiego. Zastosowałaś group_concat i słusznie. Uzyskasz tak jak pisałaś string z wartościami po ",":

id pole dodatkowe
1 coś a,b,c,....,z


Jeśli w tych dodatkowych wartościach nie występuję znak "," to wystarczy tak jak jest - jeśli występuje musisz znaleźć odpowiedni separator dla GROUP_CONCAT:

  1. GROUP_CONCAT(nazwa_pola SEPARATOR "znak")


Teraz pobrawszy takie dane masz w PHP taką tabelę:

Kod
array(
    'id' => 1,
    'pole' => 'coś',
    'dodatkowe' => 'a,b,c'
);


jeśli masz dalej pracować na takich danych w PHP posłuż się funkcją explode. Dla każdego z wierszy wyników ekploduj te dodatkowe dane do tabeli php:

  1. $count = count($wyniki);
  2. for($i = 0; $i < $count; $i++) {
  3. $wyniki[$i]['dodatkowe'] = explode(',',$wyniki[$i]['dodatkowe']);
  4. }


W ten sposób uzyskasz tablicę:

  1. 'id' => 1,
  2. 'pole' => 'coś',
  3. 'dodatkowe' => array(
  4. 'a',
  5. 'b',
  6. 'c'
  7. )
  8. );


Nie wiem czy o to chodziło - dużo byś nie musiała zmieniać.
Aui06
Nie zupełnie o to mi chodziło. Ja to potrzebuje w tabeli.

W podobny sposób zrobiłam to sama. Wypisałam wszystkie pola a na końcu w ciągu dodatkowe pola.

Tyle, że te pola są o różnych właściwościach. Nie wszystkie są tekstowe. Musze je podzielić by móc na nich operować i uzyskać prawidłowe wyniki.

Opcjonalnie zamienić je na "x" i każdy w innej komórce.
Sephirus
Praktycznie nie zmusisz MySQL'a aby wypluł Ci zmienną liczbę pól dla jednego rekordu tak by to w pełni Ci pasowało. Tak czy owak trzeba to przetwarzać w PHP do wyjściowej tablicy. Jeśli potrzebujesz działać na tych danych jeszcze w zapytaniach MySQL to prosto mówiąc nie da się tego zrobić o ile nie znasz liczby tych pól (nie jest ona stała).

Innymi słowy mysql wypluwa Ci jakąś pośrednią strukturę, którą musisz przerobić do takiej formy jakiej potrzebujesz.

Opcje w PHP są dwie:

1. Użyć tego co wyżej (o ile to możliwe) czyli GROUP_CONCAT i przetwarzaniu tego.


2. Pobrać zduplikowane rekordy dla każdej wartości dodatkowego pola. Robisz zwykłego joina i sortujesz po ID głównego rekordu. Joinujesz z tą dodatkową wartością. Uzyskujesz w ten sposób tablicę:

id pole dodatkowe
1 coś a
1 coś b
1 coś c
2 nic a
2 nic c
....

Taką strukturę łatwo procesować w PHP - iterujesz po każdym rekordzie i tworzysz odpowiednią tablicę sprawdzając przy tym do którego rekordu to przypisać.

Wynikowa tablica po takich zabiegach będzie wyglądać tak jak chciałaś - ale już po stronie PHP.


Co potrzebujesz zrobić z tymi dodatkowymi danymi? Może da się to uzyskać od innej strony?
Aui06
Ok. Chyba nie do końca możemy się porozumiemy.

- GROUP_CONCAT mam już w moim kodzie. Jak dodałam opcje z przecinkiem wyskoczył mi błąd. Z resztą z automatu dopisał mi się przecinek. (mój kod linijka 1)

- przekształcenie całości odpada to za dużo pracy

A czy nie można podzielić na części uzyskanego stringa a uzyskaną wartość zapisać do zmiennych?


Wiem że tego nie da się napisać w SQL. Nie wiem też zbytnio jak to napisać w PHP.

  1.  
  2. $count = count($wyniki);
  3. for($i = 0; $i < $count; $i++) {
  4. $wyniki[$i]['dodatkowe'] = explode(',',$wyniki[$i]['dodatkowe']);
  5. }


U mnie wypisuje wszystkie wyniki w jednej lini a że to pętla to mam całą kolumnę z takimi samymi wynikami.

To może mieć związek z ty że serwer nie obsługuje PHP 5.

Ogólnie mam sortowanie po każdym polu tak że po dodatkowych.

Nie wszystkie wpisy mają wszystkie dodatkowe pola, lub mają tylko część.

Dodatkowe pola są dynamiczne mogę je dodawać i usuwać.

Wyniki mają być zgrupowane.

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.