![]() |
![]() ![]() |
![]() |
![]()
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
W efekcie tego otrzymałam stringa (aaa, 2, 1, , bbbbb, ccc). A potrzebuje zmienne na których mogła bym pracować. |
|
|
![]()
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
![]() -------------------- 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... |
|
|
![]()
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 |
|
|
![]()
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:
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:
W ten sposób uzyskasz tablicę:
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... |
|
|
![]()
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. |
|
|
![]()
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... |
|
|
![]()
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.
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 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 21.06.2025 - 12:35 |