Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Macierz 10x10
damianooo
post 8.01.2018, 20:52:53
Post #1





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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.








Go to the top of the page
+Quote Post
aras785
post 9.01.2018, 12:37:13
Post #2





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

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


Cześć

Wrzuć próbkę SQL na: http://sqlfiddle.com i podeślij smile.gif
Go to the top of the page
+Quote Post
damianooo
post 9.01.2018, 13:09:43
Post #3





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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

Go to the top of the page
+Quote Post
nospor
post 9.01.2018, 13:20:36
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


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

"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
damianooo
post 9.01.2018, 19:22:24
Post #5





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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.

Go to the top of the page
+Quote Post
Pyton_000
post 9.01.2018, 19:55:52
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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?
Go to the top of the page
+Quote Post
damianooo
post 9.01.2018, 20:51:16
Post #7





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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 ?











Go to the top of the page
+Quote Post
Tomplus
post 10.01.2018, 05:38:59
Post #8





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


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
Go to the top of the page
+Quote Post
Pyton_000
post 10.01.2018, 08:00:48
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


A co ma piernik do wiatraka?
Go to the top of the page
+Quote Post
nospor
post 10.01.2018, 15:07:44
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


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

"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
SmokAnalog
post 10.01.2018, 15:08:12
Post #11





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


A ja z ciekawości zapytam: co przechowuje tabela MATCHDAY?
Go to the top of the page
+Quote Post
damianooo
post 10.01.2018, 22:06:11
Post #12





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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 ?

Ten post edytował damianooo 10.01.2018, 22:07:04
Go to the top of the page
+Quote Post
Pyton_000
post 11.01.2018, 16:49:53
Post #13





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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...
Go to the top of the page
+Quote Post
damianooo
post 11.01.2018, 18:10:58
Post #14





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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 .

Ten post edytował damianooo 12.01.2018, 08:41:58
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: 13.06.2025 - 11:03