Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Wyciąganie danych z dwóch tabel + języki
b_chmura
post 21.11.2012, 10:11:32
Post #1





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


Witam

Nie wiem do końca jak zadać pytanie... więc zacznę od kodu.

  1. Table #1
  2.  
  3. id|url|time


  1. Table #2
  2. id_parent|id_lang|name


Jakie rozwiązania polecicie by po zapytaniu (zapytaniach?) uzyskać taką tablice:

  1. [0] = array(
  2. [id] = 1
  3. [url] = 'http://google.pl'
  4. [name] = array(
  5. [id_lang_1 (lub 0)] = 'Nazwa w języku PL'
  6. [id_lang_2 (lub 1)] = 'Nazwa w języku EN'
  7. [id_lang_? (lub ?)] = 'Nazwa w języku ?'
  8. (...)
  9. );
  10. )
  11. [1] = array(
  12. ...
  13. )
  14.  
  15. ...


Zdaje sobie sprawę, że jest to trochę nie zrozumiałem... w razie wypadku odpowiem na każde pytanie.

Pozdrawiam
Chmura B.
Go to the top of the page
+Quote Post
nospor
post 21.11.2012, 10:18:32
Post #2





Grupa: Moderatorzy
Postów: 36 477
Pomógł: 6301
Dołączył: 27.12.2004




Tworzysz jedno zapytanie gdzie po FROM jest tabela pierwsza a w LEFT JOIN tabela druga.
W wyniku otrzymasz rekordy, które będą się powtarzały a to dlatego że dla jednej wartosci z tabela 1 będzie odpowiadać kilka z tabeli 2.
Teraz tylko w php musisz pogrupować te dane.

Tutaj pisałem jak grupować i jak tworzyć zapytanie. Było to do innych celów, ale ufam, że potrafisz tę prostą rzecz sam dostosować pod siebie mając już inny kod.
http://nospor.pl/grupowanie-wynikow.html


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
b_chmura
post 21.11.2012, 11:48:04
Post #3





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


Hmm skoro nie można tego zrobić zapytaniem SQL to wymodziłem coś takiego:

  1. if($q = mysql_query("SELECT a.*, b.* FROM `".$this->db_table."` `a` LEFT JOIN `".$this->db_tableDesc."` `b` ON a.id=b.id_parent WHERE 1=1 ".$where.";")){
  2.  
  3. while($d = mysql_fetch_assoc($q)){
  4.  
  5. $tmp[$d['id']] = $d; unset($tmp[$d['id']]['id_lang'], $tmp[$d['id']]['id_parent']);
  6.  
  7. $temp[$d['id']]['name'][$d['id_lang']] = $d['name'];
  8. $tmp[$d['id']]['name'] = $temp[$d['id']]['name'];
  9. }
  10.  
  11. return $this->data = $tmp;
  12. }


Nie podoba mi się tylko to, że gdybym oprócz "name" miał tez inne kolumny czynność musiał bym x razy powtórzyć. Może jakiś pomysł jak to zautomatyzować?
Go to the top of the page
+Quote Post
nospor
post 21.11.2012, 12:29:37
Post #4





Grupa: Moderatorzy
Postów: 36 477
Pomógł: 6301
Dołączył: 27.12.2004




Chyba trochę przekombinowałeś...
Czemu nie skorzystałeś z tego jak ja to robiłem?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
b_chmura
post 21.11.2012, 13:25:23
Post #5





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


Umiem sobie poradzić z Twoim kodem, jest w porządku.
Teraz kombinuje jak to zautomatyzować żebym nie musiał podawać jakie pole chce połączyć (zawsze będzie to pole które występuje kilka razy i ma inną wartość.

Dla przykład:

żeby z takiej tablicy:
  1.  
  2. (
  3. [0] => Array
  4. (
  5. [id] => 1
  6. [prefix] => site
  7. [url] => <a href="http://www.google.pl/" target="_blank">http://www.google.pl/</a>
  8. [id_parent] => 1
  9. [id_lang] => 1
  10. [name] => Google in PL
  11. )
  12.  
  13. [1] => Array
  14. (
  15. [id] => 1
  16. [prefix] => site
  17. [url] => <a href="http://www.google.pl/" target="_blank">http://www.google.pl/</a>
  18. [id_parent] => 1
  19. [id_lang] => 2
  20. [name] => Google in EN
  21. )
  22.  
  23. [2] => Array
  24. (
  25. [id] => 2
  26. [prefix] => blog
  27. [url] => <a href="http://bing.pl" target="_blank">http://bing.pl</a>
  28. [id_parent] => 2
  29. [id_lang] => 1
  30. [name] => Bing in PL
  31. )
  32.  
  33. [3] => Array
  34. (
  35. [id] => 2
  36. [prefix] => blog
  37. [url] => <a href="http://bing.pl" target="_blank">http://bing.pl</a>
  38. [id_parent] => 2
  39. [id_lang] => 2
  40. [name] => Bing in EN
  41. )
  42.  
  43. )


Zrobić taką:

  1. (
  2. [0] => Array
  3. (
  4. [id] => 1
  5. [prefix] => site
  6. [url] => <a href="http://www.google.pl/" target="_blank">http://www.google.pl/</a>
  7. [id_parent] => 1
  8. [id_lang] => Array(
  9. [1] = 1
  10. [2] = 2
  11. )
  12. [name] => Array(
  13. [1] = Google in PL
  14. [2] = Google in EN
  15. )
  16. )
  17.  
  18. [1] => Array
  19. (
  20. [id] => 2
  21. [prefix] => blog
  22. [url] => <a href="http://bing.pl" target="_blank">http://bing.pl</a>
  23. [id_parent] => 2
  24. [id_lang] => Array(
  25. [1] = 1
  26. [2] = 2
  27. )
  28. [name] => Array(
  29. [1] = Bing in PL
  30. [2] = Bing in EN
  31. )
  32. )
  33.  
  34. )
Go to the top of the page
+Quote Post
nospor
post 21.11.2012, 13:29:56
Post #6





Grupa: Moderatorzy
Postów: 36 477
Pomógł: 6301
Dołączył: 27.12.2004




Cytat
Umiem sobie poradzić z Twoim kodem, jest w porządku.
Twoje kombinowanie "lekko" się różni od mojego kodu stąd pytam smile.gif Ja przykładowo nie tworzyłem żadnych zmiennych pomocniczych, które prócz zaciemniania niczemu nie służa wink.gif

Co do problemu:
utwórz sobie tablicę z nazwami które chcesz grupować i iteruj po tej tablicy wewnątrz pętli


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
b_chmura
post 21.11.2012, 13:38:03
Post #7





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


Kod chciałbym wykorzystać również w przyszłości w innych projektach. Tworzenie tablicy z nazwami które chce grupować wiąże się z powtórną ingerencją jeśli te pola miałby się zmienić. Trochę nie potrzebnie gdy wiem, że mają to być pola które będą się od siebie różnić id_lang i posiadać ten sam id_parent.

Chyba właśnie przyszło mi coś do głowy.

Ps. chciałem też zrobić to bez wykorzystania pętli w pętli.
Go to the top of the page
+Quote Post
nospor
post 21.11.2012, 13:40:42
Post #8





Grupa: Moderatorzy
Postów: 36 477
Pomógł: 6301
Dołączył: 27.12.2004




Cytat
Ps. chciałem też zrobić to bez wykorzystania pętli w pętli.
A ja chciałbym latać nie mając skrzydeł wink.gif

Tu dodatkowa pętla nic nie psuje, wręcz jest wymagany jeśli nie chcesz powtarzać kodu
Od biedy możesz napisać funkcję która robi to co chcesz i ją wywoływać z róznymi parametrami będącymi nazwami po których chcesz grupować


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
b_chmura
post 21.11.2012, 14:21:55
Post #9





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


  1. foreach($d as $k => $dd){
  2.  
  3. $tmp[$d['id_parent']][$k][$d['id_lang']] = $dd;
  4. }


Coś takiego robi w przybliżeniu to co bym chciał. Różnica polega na tym, że każdą kolumnę powiela o ilość id_lang. Nawet te które nie różnią się wartościami.

W przybliżeniu dostaję wynik:
  1. (
  2. [1] => Array
  3. (
  4. [id] => Array
  5. (
  6. [1] => 1
  7. [2] => 1
  8. )
  9.  
  10. [prefix] => Array
  11. (
  12. [1] => asd
  13. [2] => asd
  14. )
  15.  
  16. [url] => Array
  17. (
  18. [1] => [url="http://asd.asd"]http://asd.asd[/url]
  19. [2] => [url="http://asd.asd"]http://asd.asd[/url]
  20. )
  21.  
  22. [id_parent] => Array
  23. (
  24. [1] => 1
  25. [2] => 1
  26. )
  27.  
  28. [id_lang] => Array
  29. (
  30. [1] => 1
  31. [2] => 2
  32. )
  33.  
  34. [name] => Array
  35. (
  36. [1] => Zawiszy
  37. [2] => Zawiszen
  38. )
  39.  
  40. )
  41.  
  42. [2] => Array
  43. (
  44. [id] => Array
  45. (
  46. [1] => 2
  47. [2] => 2
  48. )
  49.  
  50. [prefix] => Array
  51. (
  52. [1] => bartek
  53. [2] => bartek
  54. )
  55.  
  56. [url] => Array
  57. (
  58. [1] => [url="http://nuvola.pl"]http://nuvola.pl[/url]
  59. [2] => [url="http://nuvola.pl"]http://nuvola.pl[/url]
  60. )
  61.  
  62. [id_parent] => Array
  63. (
  64. [1] => 2
  65. [2] => 2
  66. )
  67.  
  68. [id_lang] => Array
  69. (
  70. [1] => 1
  71. [2] => 2
  72. )
  73.  
  74. [name] => Array
  75. (
  76. [1] => Bartka
  77. [2] => Bartkaen
  78. )
  79.  
  80. )
  81.  
  82. )


EDIT:
Oczywiście w zamierzeniu chciałbym, żeby kolumny z taką samą wartością nie były tablicą a od razu wartością.

[id_lang] i [name] miałby zostać tak jak są.

Nie wiem jak sprawdzić czy poprzedni jest inny czy ma takie same wartości i w takim wypadku zostawić go w spokoju.

Ten post edytował b_chmura 21.11.2012, 14:25:22
Go to the top of the page
+Quote Post
nospor
post 21.11.2012, 14:26:19
Post #10





Grupa: Moderatorzy
Postów: 36 477
Pomógł: 6301
Dołączył: 27.12.2004




Czyli że powielanie wszystkiego jak leci jest niby lepsze od zapisanie tego co ma powielać w tabeli?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
b_chmura
post 21.11.2012, 14:31:34
Post #11





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


Nieee oczywiście, że nie. Teraz chciałbym dodać jakiś warunek który będzie sprawdzał czy dana kolumna ma kilka wartości czy jedną. Gdy tylko jedną - nie robić tablicy.

Sęk w tym, że nie wiem jaki warunek...
Go to the top of the page
+Quote Post
nospor
post 21.11.2012, 14:35:26
Post #12





Grupa: Moderatorzy
Postów: 36 477
Pomógł: 6301
Dołączył: 27.12.2004




A czemu poprostu nie użyjesz dodatkowej tablicy która będzie zawierać które kolumny masz grupować?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
b_chmura
post 21.11.2012, 14:42:28
Post #13





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


Funkcje chciałbym użyć w wielu modułach, w systemie wielu języków.
Chciałbym za pomocą jednej funkcji dostać tablicę z wynikami z bazy bez wiedzy czy i ile kolumn ma wartości w różnych językach.
Po prostu gdy taka istnieje zamiast wartości pojawia się tablica z wartościami z kluczami jako id języka który reprezentuje.

Jeśli ktoś nie rozumie tego co napisałem postaram się to szerzej opisać po pracy.

Go to the top of the page
+Quote Post
nospor
post 21.11.2012, 14:46:09
Post #14





Grupa: Moderatorzy
Postów: 36 477
Pomógł: 6301
Dołączył: 27.12.2004




Ja rozumiem co napisałeś, nie rozumiem jednak czemu upierasz się na zrobieniu tego super uniwersalnie, bez podawania parametrów co chcesz grupować.


Zaś wracając do Twojego ogólnego problemu, to przecież przed włożeniem wartości do tablicy jesteś w stanie stwierdzić czy taki element juz w tej tablicy jest czy go nie ma. Jak nie ma to wkładasz , jak jest to nie. W ten sposób gdy wszystkie elementy się będą powtarzać to otrzymasz tablicę z jednym elementem na wyjściu, a to juz możesz bez problemu zamienić na wartość zamiast tablicy


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
b_chmura
post 21.11.2012, 15:38:10
Post #15





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


Cytat
Ja rozumiem co napisałeś, nie rozumiem jednak czemu upierasz się na zrobieniu tego super uniwersalnie, bez podawania parametrów co chcesz grupować.


Bo ja wiem, po prostu chciałbym. Mogłoby to znacząco przyśpieszyć tworzenie następnych mniejszych lub większych modułów.
No nic. W domu może jeszcze coś pokombinuję.

Dzięki za pomoc ;-)

Ten post edytował b_chmura 21.11.2012, 15:38:35
Go to the top of the page
+Quote Post
nospor
post 21.11.2012, 15:40:12
Post #16





Grupa: Moderatorzy
Postów: 36 477
Pomógł: 6301
Dołączył: 27.12.2004




Cytat
Mogłoby to znacząco przyśpieszyć tworzenie następnych mniejszych lub większych modułów.
A w jaki sposób wywołanie metody
getData()
zamiast
getData(array('lang','name'))
Ma przyspieszyć coś? Moim zdaniem w pewnym momencie możesz się przejechać na tym uniwersaliźmie

Cytat
W domu może jeszcze coś pokombinuję.
Jeśli się nadal przy swoim upierasz to napisałem ci jak masz to rozwiązać. Tu nie ma nic do kombinowania. Proste rozwiązanie smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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: 6.06.2024 - 16:04