Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Wypisanie tabeli z połączeniem jeden do wielu
Aui06
post 7.04.2014, 09:07:53
Post #1





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 27.03.2014

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post
Sephirus
post 7.04.2014, 09:14:08
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Aui06
post 7.04.2014, 09:25:29
Post #3





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 27.03.2014

Ostrzeżenie: (0%)
-----


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

Ten post edytował Aui06 7.04.2014, 09:57:54
Go to the top of the page
+Quote Post
Sephirus
post 7.04.2014, 10:00:07
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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ć.


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Aui06
post 7.04.2014, 10:47:05
Post #5





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 27.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Sephirus
post 7.04.2014, 11:11:37
Post #6





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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?


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Aui06
post 7.04.2014, 14:39:34
Post #7





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 27.03.2014

Ostrzeżenie: (0%)
-----


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.



Ten post edytował Aui06 7.04.2014, 14:19:53
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 21.06.2025 - 12:35