Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Poważne pytanie o zapytania w pętli
Forum PHP.pl > Forum > Bazy danych > MySQL
dizor
Mam pytanie - czy w takim przypadku można zastosować zapytanie w pętli? Ewentualnie jakie jest inne rozwiązanie tego problemu?

Chodzi o uzyskanie tablicy jak poniższa: potrzebuję mieć w niej kategorie i podłączone do nich wybrane podkategorie (wybierane one są z tabeli wg. potrzeb, tzn. nie są podłączone wszystkie podkategorie tylko wybrane według potrzeb). Z jednej strony mój pomysł opiera się właśnie na zapytaniu w pętli - a drugi to łączenie dwóch tablic po key'u. Wydaje mi się, że pomysł z zapytaniem w pętli jest lepszy, aczkolwiek na tzw. "czuja" nie podoba mi się samo hasło "zapytania w pętli".

Bardzo proszę kogoś o dokładną analizę kodu - borykam się z tym problemem od jakiegoś czasu i do tej pory nie udało mi się uzyskać satysfakcjonującej odpowiedzi.

Generalnie nie chodzi tutaj o funkcję kategorie / podkategorie - to dałem tylko dla przykładu. W rzeczywistości każda gałąź [sub] -> ma mieć jeszcze [data] -> a potem duże [items].

  1. (
  2. [0] => Array
  3. (
  4. [cat] => stdClass Object
  5. (
  6. [code_finish_cat] => 1
  7. [cat_name] => Kategoria A
  8. )
  9.  
  10. [sub] => Array
  11. (
  12. [0] => stdClass Object
  13. (
  14. [code_finish_cat] => 1
  15. [subcat_name] => Podkategoria 1
  16. )
  17.  
  18. [1] => stdClass Object
  19. (
  20. [code_finish_cat] => 2
  21. [subcat_name] => Podkategoria 2
  22. )
  23. )
  24.  
  25. )
  26.  
  27. [1] => Array
  28. (
  29. [cat] => stdClass Object
  30. (
  31. [code_finish_cat] => 2
  32. [cat_name] => Kategoria B
  33. )
  34.  
  35. [sub] => Array
  36. (
  37. [0] => stdClass Object
  38. (
  39. [code_finish_cat] => 2
  40. [subcat_name] => Podkategoria 1
  41. )
  42.  
  43. [1] => stdClass Object
  44. (
  45. [code_finish_cat] => 2
  46. [subcat_name] => Podkategoria 2
  47. )
  48.  
  49. [2] => stdClass Object
  50. (
  51. [code_finish_cat] => 2
  52. [subcat_name] => Podkategoria 3
  53. )
  54.  
  55. )
  56.  
  57. )
  58.  
  59. )


Powyższa tablica uzyskana z zapytania:

  1.  
  2. /* GET PRODUCTS MAIN DATA
  3. */
  4.  
  5. $this->db->where('main.products_id', 1);
  6. $this->db->select('
  7. main.products_id,
  8. main.products_name
  9. ',false);
  10.  
  11. $query = $this->db->get('test_products main');
  12. $A = $query->row();
  13.  
  14. /* GET CATEGORIES MAIN DATA
  15. */
  16.  
  17. $this->db->where('main.code_products', $A->products_id);
  18. $this->db->select('
  19. main.code_finish_cat,
  20. t1.cat_name
  21. ',false);
  22.  
  23. $this->db->join('test_base_finish_cat t1', 't1.cat_id = main.code_finish_cat', 'left');
  24. $this->db->group_by('code_finish_cat');
  25.  
  26. $query = $this->db->get('test_products_categories main');
  27. $B = $query->result();
  28.  
  29. foreach($B as $key => $item){
  30.  
  31. $this->db->where('main.code_finish_cat', $item->code_finish_cat);
  32. $this->db->select('
  33. main.code_finish_cat,
  34. t1.subcat_name
  35. ',false);
  36.  
  37. $this->db->join('test_base_finish_subcat t1', 't1.subcat_id = main.code_finish_subcat', 'left');
  38. $this->db->group_by('code_finish_subcat');
  39.  
  40. $query = $this->db->get('test_products_categories main');
  41. $C = $query->result();
  42.  
  43. $D[] = array(
  44. 'cat' => $item,
  45. 'sub' => $C
  46. );
  47.  
  48.  
  49. }
  50.  
  51.  
Kasyx
Mając dużą tablicę o wielu poziomach zajedziesz bazę danych.

Już lepiej użyć xml w tym celu. generujesz sobie odpowiedni plik, a następnie używasz prostej biblioteki SimpleXml do obróbki. W efekcie dostajesz tablicę obiektów, bardzo podobną do tej, którą przedstawiłeś.

Następnie wygenerowanie listy kategorii to kwestia napisania jednej funkcji rekurencyjnej, która przechodzi przez całą tablicę i wywołuje samą siebie, jak natrafi na 'głębszy' poziom
Mati7
Myślę, że xml nie będzie tutaj potrzebny. Wdaje mi się, że chodzi ci o zwykła strukturę drzewiastą, zwykle kategorie i wszystkie podkategorie trzyma się w jednej tabeli i wyciąga jednym zapytaniem, a drzewka można zrobić na wiele sposobów.
dizor
Chodzi jednak o coś bardziej skomplikowanego - przynajmniej tak mi się wydaje - chociaż być może zbytnio sobie to utrudniam.

  1. (
  2. [0] => Array
  3. (
  4. [cat] => Array
  5. (
  6. [code_finish_cat] => 1
  7. [cat_name] => Kategoria
  8. )
  9.  
  10. [sub] => Array
  11. (
  12. [0] => Array
  13. (
  14. [id] => 1
  15. [code_finish_cat] => 1
  16. [subcat_name] => Podkategoria 1
  17. [groups] => Array
  18. (
  19. [0] => Array
  20. (
  21. [price] => 100.00
  22. [items] => Array
  23. (
  24. (tutaj duza tablica z items)
  25. )
  26.  
  27. )
  28.  
  29. )
  30.  
  31. )
  32.  
  33. [1] => Array
  34. (
  35. [id] => 2
  36. [code_finish_cat] => 1
  37. [subcat_name] => Podkategoria 2
  38. [groups] => Array
  39. (
  40. [0] => Array
  41. (
  42. [price] => 200.00
  43. [items] => Array
  44. (
  45. (tutaj duza tablica z items)
  46. )
  47.  
  48. )
  49.  
  50. )
  51.  
  52. )
  53.  
  54. )
  55.  
  56. )
  57.  
  58. )
Mati7
Czyli tworzysz sobie tablicę

1. z kategorią
2. z podkategoriami
3. z elementami tych podkategorii

Robienie tego w pętli nie jest dobrym pomysłem, ale w ostateczności mogło by się nadać (jak nie masz innego pomysłu) jeśli masz niewiele podkategorii,
bo zakładam że pobierasz jedną kategorie i wszystkie jej podkategorie na raz - no i oczywiście w takim przypadku powinieneś to cachować.

Tak czy inaczej ja bym użył drzewek do kategorii i do tego dokleił tablicę z itemami (to chyba max 2 zapytania), no chyba że chodzi ci zupełnie o coś innego czego ja nie mogę zrozumieć po tym co napisałeś.

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.