Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Macierz 10x10
Forum PHP.pl > Forum > PHP
damianooo
Potrzebuję w swojej aplikacji stworzyć macierz 10x10 wypełnioną typami użytkowników w wybranej kolejce. Przy pozycjach bez typów wstawić znak "-" .

Mam następującą strukturę bazy danych:

tabela USER,
tabela TYPE, ; join z MEET i USER
tabela MEET, ; join z MATCHDAY
tabela MATCHDAY

Co po kolei robię:

1. Pobranie typów użytkowników (jest 10 użytkowników) z wybranej kolejki.
2. Pobranie listy 10 meczy w wybranej kolejki
3. Połączenie za pomocą pętli meczy z typami użytkowników

Zapytanie jakie mam:

  1. SELECT
  2. m.matchday_id,
  3. t.meet_id,
  4. t.host_type AS hostType,
  5. t.guest_type AS guestType,
  6. u.username AS username,
  7. u.shortname
  8. FROM user u
  9. LEFT JOIN type t ON t.user_id = u.id
  10. LEFT JOIN meet m ON t.meet_id = m.id AND m.matchday_id = 1
  11. WHERE u.STATUS = 1
  12. ORDER BY u.id


Złączenie listy meczy z listą typów:

  1. foreach($meets as $meet){
  2. foreach ($usersTypes as $types){
  3. if($types['matchday_id'] != NULL){
  4. if($meet['meet_id'] == $types['meet_id']) {
  5. $result[$types['meet_id']]['types'][] = $types['hostType'].' - '.$types['guestType'];
  6. }
  7. }else{
  8. $result[$meet['meet_id']]['types'][] = '-';
  9. }
  10. }
  11.  
  12. $result[$meet['meet_id']]['meet_id'] = $meet['meet_id'];
  13. $result[$meet['meet_id']]['host'] = $meet['host'];
  14. $result[$meet['meet_id']]['guest'] = $meet['guest'];
  15. $result[$meet['meet_id']]['host_shortname'] = $meet['host_shortname'];
  16. $result[$meet['meet_id']]['guest_shortname'] = $meet['guest_shortname'];
  17. }



Niestety powyższe w przypadku typu 7 użytkowników zwraca mi 73 rekordy (3 NULL = 3 userom którzy nie typowali) dla 1 kolejki
i również 73 typy (z matchday_id = NULL) dla kolejki 2 itd.








aras785
Cześć

Wrzuć próbkę SQL na: http://sqlfiddle.com i podeślij smile.gif
damianooo
Mam taką strukturę bazy danych:

tabela USER (pole: status)
tabela TYPE (klucze obce: meet_id , user_id)
tabela MEET (jako mecz) (pole: matchday)


Użytkowników ze statusem = 1 mam 10.
Meczy (MEET) ze statusem matchday = 1 też jest 10.

Jak zrobić zapytanie aby otrzymać macierz 10x10 a więc 100 rekordów z powyższego ?
Chodzi o to że w tabeli TYPE może nie być rekordów wiążących USER z TYPE i TYPE z MEET.

PS. Dodam tylko że w całości chodzi o to że użytkownicy typują wyniki meczy i ci co nie wytypują chciałbym aby SQL podał mi w tych miejscach NULL .
Zawsze chcę mieć 100 rekordów bo 10 użytkowników i 10 meczy.

Poniższe zapytanie niestety się nie sprawdza bo zwraca mi 73 rekordy gdy 3 użytkowników nie wytypuje:

  1. SELECT
  2. m.matchday_id,
  3. t.meet_id,
  4. t.host_type AS hostType,
  5. t.guest_type AS guestType,
  6. u.username AS username,
  7. u.shortname
  8. FROM user u
  9. LEFT JOIN type t ON t.user_id = u.id
  10. LEFT JOIN meet m ON t.meet_id = m.id AND m.matchday_id = 1
  11. WHERE u.STATUS = 1
  12. ORDER BY u.id

nospor
A czemu sie uparles, ze to zapytanie ma ci zwrocic macierz?
Z tego co zrozumialem to masz wyswietlic macierz, tak?

To machnij w wierwszach userow, w kolumnach mecze, czy tam na odwrot jak tam sobie chcesz.
Teraz pobierz sobie poprostu z bazy kto co wytypowal, Jak to bedzie 70 to dobrze, jak to bedzie 32 tez dobrze.
No i teraz sobei lecisz w php po macierzy i patrzych czy dla pary user-mecz masz dane czy nie .Jak nie masz to wstawiasz NIC, jak masz to wstawiasz w komorke co tam chcesz wstawic.
damianooo
no w sumie to co chcę zrobić to jest tam jakaś macierz

Mówisz machnąć userów i mecze ... rozumiem że pobierać je w osobnych zapytaniach ?
Tylko że wtedy będę miał aż 3 zapytania do bazy czego chciałem uniknąć bo i tak mam już 2 zapytania (jedno do typów i jedno do meczy).
Chyba że miałbym to trzymać po pobraniu w CACHE i odpytywać CACHE - myślę jednak że przy tak niewielkiej ilości to nie ma takiej potrzeby.

3 dodatkowe zapytania do bazy przy innych które jednocześnie na stronie robią już inne rzeczy.

Rozumiem nospor że nie powinienem się tym przejomować i to nie jest złe podejście ?
Spoko chcę skorzystać z podopowiedzi doświadczonych programistów.

Pyton_000
Widać że nie zrozumiałeś....

W PHP utwórz sobie macież 10x10. Zajmie to 0.01s.
Pobierz rekordy tak jak to robisz.
W pętli wpisz sobie te rekordy do odpowiedniego miejsca i tyle...

Co w tym skomplikowanego?
damianooo
Mówiąc "macierz" rozumiem mówimy o tablicy wielowymiarowej (tutaj dwuwymiarowej) a wiec takiej:

$types[1][1] = "1-1";
$types[1][2] = NULL;
$types[1][3] = "1-1";
$types[1][4] = "1-1";
...
$types[10][7] = "1-1";
$types[10][8] = NULL;
$types[10][9] = NULL;
$types[10][10] = "1-1";

Dokładnie powyższe chciałbym uzyskać (klucze wiersze ID meczu a klucze kolumny ID uzytkownika).

Tylko właśnie nadal nie rozumiem jak miałbym wypełnić klucze tablicy IDkami meczów i użytkowników ?
Użytkowników w bazie jest więcej niż 10 ale chcę pobrać tylko tych ze statusem 1 (10sztuk)
Meczy też jest więcej ale chcę pobrać tylko te które mają matchday = 1 (10 sztuk)

Rozumiem że z tego jednego zapytania muszę wydobyć i przypisać od razu ID meczy i użytkowników ?











Tomplus
Ja coś takiego zrobiłem używają klasy roundrobin.

Klasa trochę przestarzała, ale spełnia swoje założenia, także do dalszej pracy.
https://www.phpclasses.org/package/5563-PHP...tml#information
Pyton_000
A co ma piernik do wiatraka?
nospor
Cytat
Mówisz machnąć userów i mecze ... rozumiem że pobierać je w osobnych zapytaniach ?
Jesli sie boisz ty dwoch dodatkowych prostych zapytan, to userow masz przeciez w swoim zapytaniu, wiec juz masz o jedno mniej smile.gif
SmokAnalog
A ja z ciekawości zapytam: co przechowuje tabela MATCHDAY?
damianooo
ehh ... pobrałem sobie w osobnych zapytaniach IDki userów i mecze .

Ustawiłem je tak jako klucze:

  1. foreach($meets as $meet){
  2. foreach ($users as $user){
  3. $matrix[$meet->getId()][$user->getId()] = NULL;
  4. }
  5. }


lista typów pobrana z bazy jest taka:

  1. array(73) {
  2. [0]=>
  3. array(4) {
  4. ["meet_id"]=>
  5. string(1) "1"
  6. ["user_id"]=>
  7. string(6) "2"
  8. ["hostType"]=>
  9. string(1) "2"
  10. ["guestType"]=>
  11. string(1) "0"
  12. }
  13. [1]=>
  14. array(4) {
  15. ["meet_id"]=>
  16. string(1) "2"
  17. ["user_id"]=>
  18. string(6) "3"
  19. ["hostType"]=>
  20. string(1) "2"
  21. ["guestType"]=>
  22. string(1) "0"
  23. }
  24. [2]=>
  25.  
  26. itd.


Rozumiem że mogę ją teraz wypełnić tylko za pomocą aż trzech pętli foreach ?

  1. foreach($matrix as $key => $field){
  2. foreach($field as $k => $value){
  3. foreach($userTypes as $type){
  4. if(){
  5.  
  6. }
  7. }
  8. }
  9. }


Może to tak wyglądać finalnie ?
Pyton_000
A czemu 3?

Mając już wygenerowaną macież iterujesz tylko po tablicy na podstawie której chcesz wprowadzić dane podając jako indeksy wybrane wartości...
damianooo
a więc tak:

  1. foreach ($usersTypes as $type){
  2. $matrix[$type['meet_id']][$type['user_id']] = $type['hostType'] . ' - ' . $type['guestType'];
  3. }



Dzięki ! O to mi chodziło .
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-2024 Invision Power Services, Inc.