Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Uzupełnienie tablicy
Forum PHP.pl > Forum > PHP
damianooo
Chciałbym otrzymać taką kolejność ID użytkowników

  1. array(3,4,6,8,7,2,1)


w pewnym zapytaniu SQL dostaję taką tablicę (a więc brakuje ID 4 i 6)

  1. array(3,8,7,2,1)


Jak zrobić aby na pozycjach brakujących była wartość np.NULL aby zachować ustaloną wcześniej kolejność, a więc taką tablicę:

  1. array(3,null,null,8,7,2,1)


?
Pyton_000
W pewnym zapytaniu musisz dodać Null...
damianooo
hmm ...
też zastanawiałem się nad tym aby od strony SQLa to zrobić tylko chyba nie wiem jak

całe "pewne zapytanie SQL" jest trochę bardziej skomplikowane:

  1. SELECT
  2. m0_.id AS id0, t1_.name AS name1,
  3. t2_.name AS name2,
  4. t3_.host_type AS host_type3,
  5. t3_.guest_type AS guest_type4,
  6. u4_.username AS username5,
  7. m0_.term AS term6
  8. FROM type t3_
  9. INNER JOIN meet m0_ ON t3_.meet_id = m0_.id
  10. INNER JOIN team t1_ ON m0_.hostTeam_id = t1_.id
  11. INNER JOIN team t2_ ON m0_.guestTeam_id = t2_.id
  12. INNER JOIN matchday m5_ ON m0_.matchday_id = m5_.id
  13. INNER JOIN user u4_ ON t3_.user_id = u4_.id
  14. WHERE m5_.id = 8
  15. ORDER BY u4_.id
  16. ASC, m0_.id ASC


Myślisz że LEFT JOIN powinienem zastosować ?
I jeśli dany użytkownik nie wytypował to powinno mi zwrócić również jego ID czy myślałeś o innym rozwiązaniu ?
nospor
Jesli chcesz wyswietlic wszystkie osoby to masz robic
FROM user
a w LEFT JOIN laczyc reszte tabel.
PRzeciez to dosc logiczne
damianooo
mówisz że tak:

  1. SELECT
  2. m.id AS id0,
  3. t1.name AS name1,
  4. t2.name AS name2,
  5. t.host_type AS host_type3,
  6. t.guest_type AS guest_type4,
  7. u.username AS username5,
  8. m.term AS term6
  9. FROM user u
  10. LEFT OUTER JOIN type t ON t.user_id = u.id
  11. LEFT OUTER JOIN meet m ON t.meet_id = m.id
  12. LEFT OUTER JOIN team t1 ON m.hostTeam_id = t1.id
  13. LEFT OUTER JOIN team t2 ON m.guestTeam_id = t2.id
  14. LEFT OUTER JOIN matchday md ON m.matchday_id = md.id
  15. WHERE
  16. md.id = 8
  17. AND
  18. u.STATUS = 1
  19. ORDER BY u.id
  20. ASC, m.id ASC


?

Nadal mam 80 rekordów zamiast 100 (10 użytkowników razy 10 meczy do wytypowania)
nospor
NIe, napisalem wyraznie LEFT JOIN.

Poza tym gdzie trzymasz tabele meczy? W meet czy w type?
damianooo
tabele meczy w meet.

Zmiana na :

  1. SELECT
  2. m.id AS id0,
  3. t1.name AS name1,
  4. t2.name AS name2,
  5. t.host_type AS host_type3,
  6. t.guest_type AS guest_type4,
  7. u.username AS username5,
  8. m.term AS term6
  9. FROM user u
  10. LEFT JOIN type t ON t.user_id = u.id
  11. LEFT JOIN meet m ON t.meet_id = m.id
  12. LEFT JOIN team t1 ON m.hostTeam_id = t1.id
  13. LEFT JOIN team t2 ON m.guestTeam_id = t2.id
  14. LEFT JOIN matchday md ON m.matchday_id = md.id
  15. WHERE
  16. md.id = 8
  17. AND
  18. u.STATUS = 1
  19. ORDER BY u.id
  20. ASC, m.id ASC


też nie pomogła
nospor
Skoro mecze sa w meet to meet nie moze byc po type. Jak niby wezmiesz wszystkie meet jesli type nie zawiera odnosnikow do wszystkich meet...
damianooo
ale meet nie ma złączenia z user wiec jak mam zlaczyc user z meet ?
type jest zlaczone z meet i z user
nospor
Albo daj user i meet we FROM
Albo meet pobieraj oddzielnym zapytaniem i lacz w sobie w php

Do wyboru do koloru smile.gif
damianooo
hmm nie wiem czemu MySQL wyrzuca bład
Unknown column 'u.id' in 'on clause'

  1. SELECT
  2. m.id AS id0,
  3. t1.name AS name1,
  4. t2.name AS name2,
  5. t.host_type AS host_type3,
  6. t.guest_type AS guest_type4,
  7. u.username AS username5,
  8. m.term AS term6
  9. FROM user u, meet m
  10. LEFT JOIN type t ON t.user_id = u.id
  11. LEFT JOIN team t1 ON m.hostTeam_id = t1.id
  12. LEFT JOIN team t2 ON m.guestTeam_id = t2.id
  13. LEFT JOIN matchday md ON m.matchday_id = md.id
  14. WHERE
  15. md.id = 8
  16. AND
  17. u.STATUS = 1
  18. ORDER BY u.id
  19. ASC, m.id ASC
nospor
zapomniales o nawiasach

FROM (user u, meet m )
damianooo
Nie wiem czy wszystko jest ok dalej ponieważ poniższe wywala mi 820 rekordów.
Chyba za dużo złączeń LEFT JOIN

  1. SELECT
  2. m.id AS id0,
  3. t1.name AS name1,
  4. t2.name AS name2,
  5. t.host_type AS host_type3,
  6. t.guest_type AS guest_type4,
  7. u.username AS username5,
  8. m.term AS term6
  9. FROM (user u, meet m)
  10. LEFT JOIN type t ON t.user_id = u.id
  11. LEFT JOIN team t1 ON m.hostTeam_id = t1.id
  12. LEFT JOIN team t2 ON m.guestTeam_id = t2.id
  13. LEFT JOIN matchday md ON m.matchday_id = md.id
  14. WHERE
  15. md.id = 8
  16. AND
  17. u.STATUS = 1
  18. ORDER BY u.id
  19. ASC, m.id ASC
nospor
From zwraca ci 100 rekordow. Teraz osmiu uzytkonikow wytypowalo wiec masz 8 * 100 smile.gif

Dlatego osobiscie wybralbym opcje nr 2, czyli mecze pobralbym drugim zapytaniem. Naprawde nie zawsze wszystko jest sens robic jednym zapytaniem
damianooo
.. hmm próbuję podzielić na dwa zapytania ale chciałem się Ciebie jeszcze dopytać czy to dobrze rozumiem .

Zapytanie drugie na mecze powinno wyświetlić mi 10 rekordów (bo 10 meczy do wytypowania) .

A zapytanie pierwsze powinno mi zwrócić 100 czy 82 rekordy ?

Bo zrobiłem tak jak poniżej i wychodzi mi 82 :

  1. SELECT
  2. t.host_type AS host_type3,
  3. t.guest_type AS guest_type4,
  4. u.username AS username5
  5. FROM user u
  6. LEFT JOIN type t ON t.user_id = u.id
  7. WHERE
  8. u.STATUS = 1
  9. ORDER BY u.id



nospor
82. wszystko sie zgadza
damianooo
ok mam tak, typy userow:

  1. array(82) {
  2. [0]=>
  3. array(4) {
  4. ["meet_id"]=>
  5. string(1) "1"
  6. ["hostType"]=>
  7. string(1) "0"
  8. ["guestType"]=>
  9. string(1) "2"
  10. ["username"]=>
  11. string(6) "Damian"
  12. }
  13. [1]=>
  14. array(4) {
  15.  
  16. ...
  17.  
  18. }
  19. [70]=>
  20. array(4) {
  21. ["meet_id"]=>
  22. NULL
  23. ["hostType"]=>
  24. NULL
  25. ["guestType"]=>
  26. NULL
  27. ["username"]=>
  28. string(9) "Przemek 2"
  29. }
  30. [71]=>
  31. array(4) {
  32. ["meet_id"]=>
  33. NULL
  34. ["hostType"]=>
  35. NULL
  36. ["guestType"]=>
  37. NULL
  38. ["username"]=>
  39. string(6) "Adam 2"
  40. }
  41. [72]=>
  42.  
  43. ....
  44.  


i mecze

  1. array(10) {
  2. [0]=>
  3. array(5) {
  4. ["meet_id"]=>
  5. int(1)
  6. ["host"]=>
  7. string(12) "FC Barcelona"
  8. ["guest"]=>
  9. string(11) "Real Madryt"
  10. ["description"]=>
  11. string(16) "Liga Hiszpańska"
  12. ["term"]=>
  13. string(23) "Wtorek,12-12-2016,21:00"
  14. }
  15. [1]=>
  16. array(5) {
  17.  


Nastepnie złączam:

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


dostaje ciagle typy tylko tych co typowali:

  1. array(10) {
  2. [1]=>
  3. array(4) {
  4. ["types"]=>
  5. array(8) {
  6. [0]=>
  7. string(5) "0 - 2"
  8. [1]=>
  9. string(5) "1 - 1"
  10. [2]=>
  11. string(5) "1 - 0"
  12. [3]=>
  13. string(5) "2 - 0"
  14. [4]=>
  15. string(5) "0 - 1"
  16. [5]=>
  17. string(5) "2 - 0"
  18. [6]=>
  19. string(5) "1 - 2"
  20. [7]=>
  21. string(5) "2 - 0"
  22. }
  23. ["meet_id"]=>
  24. int(1)
  25. ["host"]=>
  26. string(12) "FC Barcelona"
  27. ["guest"]=>
  28. string(11) "Real Madryt"
  29. }
  30. [2]=>



Chcę osiągnąć coś takiego:

  1. array(10) {
  2. [0] => array(3) {
  3. ["meet_id"] => 1,
  4. ["host"] => "team 1",
  5. ["guest"] => "team 2",
  6. ["types"] => array(10) {
  7. ["0-1","0-0","2-1","0-1","-","2-1","0-1","0-0","-","2-1"]
  8. }
  9. }
  10. [1] .... itd.
  11. }


gdzie brak typu uzytkownika bedzie oznaczane np. "-" (i ma być zachowana kolejność użytkowników)
nospor
Jak dla mnie to tablica powinna byc po uzytkownika, w nich powinna byc informacja o meet a w meet powinny byc typy.

Ale byc moze twoj zamysl jest inny. NIe wiem co chcesz potem z ta tablica robic.
damianooo
udało się smile.gif ... miało być po prostu tak jak poniżej (wystarczyło się z tym przespać i przysiąść porządnie smile.gif ) - w sumie niewielka zmiana do tego co miałem:

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


Odpowiadając @nospor na Twoje wątpliwości jaki był mój zamysł to :

entity TYPE (typ) ma meet_id oraz user_id

Potrzebowałem w szablonie TWIG wyświetlać dane w poniższy sposób:
A więc:
mecz1 i kolejno obok siebie 10 typów
mecz2 i kolejno obok siebie 10 typów
itd. :

  1. {% for key,type in types %}
  2. <tr>
  3. <td>{{ type.host }} - {{ type.guest }}</td>
  4. {% for tp in type.types %}
  5. <td>{{ tp }}</td>
  6. {% endfor %}
  7. </tr>
  8. {% endfor %}
  9. </table>


do tego potrzebowałem takiej tablicy:

  1. array(10) {
  2. [0] => array(4) {
  3. ["meet_id"] => 1,
  4. ["host"] => "team 1",
  5. ["guest"] => "team 2",
  6. ["types"] => array(10) {
  7. ["0-1","0-0","2-1","0-1","-","2-1","0-1","0-0","-","2-1"]
  8. }
  9. }
  10. [1] .... itd.
  11. }


dzięki raz jeszcze za pomoc
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.