Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Wyciąganie danych z dwóch tabel + języki
Forum PHP.pl > Forum > PHP
b_chmura
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.
nospor
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
b_chmura
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ć?
nospor
Chyba trochę przekombinowałeś...
Czemu nie skorzystałeś z tego jak ja to robiłem?
b_chmura
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. )
nospor
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
b_chmura
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.
nospor
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ć
b_chmura
  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.
nospor
Czyli że powielanie wszystkiego jak leci jest niby lepsze od zapisanie tego co ma powielać w tabeli?
b_chmura
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...
nospor
A czemu poprostu nie użyjesz dodatkowej tablicy która będzie zawierać które kolumny masz grupować?
b_chmura
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.

nospor
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
b_chmura
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 ;-)
nospor
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
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.