Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie - JOIN czy coś...
Forum PHP.pl > Forum > Bazy danych
Rafiki23
Witam,

Mam pewien problem... gdyż nie wiem jak mam połączyć zapytania SQL w jedno (obecnie baza mi się strasznie krzaczy z powodu bardzo wielu zapytań) myślałem o JOINie, ale nie mam pomysłu jak go użyć, a jak już jest, to niestety nie idzie...

A więc tak. Mam dwie tabele.

- wyniki
MeczID | SezonID | LigaID | MeczData | GospodarzID | GoscID | BramkiGospodarz | BramkiGosc

- bramki
ID | MeczID | LigaID | SezonID | Pilkarz | DruzynaID | Minuta

Teraz robiłem to tak :
Pobierałem wyniki z jakiegoś zakresu dat w danej lidze, później jak wyświetlałem wierszami wyniki, to robiłem zapytanie WHERE MeczID = '$mecz' AND DruzynaID = '$data[GospodarzID]' i wyświetlałem strzelców goli gospodarzy.
To samo robiłem dla gosci. Czyli do jednego meczu robiłem dodatkowo 2 zapytania... :/ A jak meczów było np na stronie 10, to robiłem 20 zapytań + zapytanie o wyniki.

Dlatego mam pytanie o pomoc... jak to zapytanie skonstruować i czy jest taka możliwość, żeby zrobić to w jednym zapytaniu i dopiero jakoś to w skrypcie poukładać ?

Z góry dziękuję za pomoc smile.gif
Exek
trochę mało przejrzyście napisałeś, ale może najpierw zbierz jakie potrzebujesz ID meczów i gospodarzy (jakiś array w php) a potem osobne zapytanie które pobierze te rekordy naraz?
webdice
Niewiele ma to wspólnego z PHP. Przenoszę na Bazy danych.
JoShiMa
Nie wiem czy dobrze zrozumiałam co chcesz zrobić, więc odpowiadam trochę po omacku.

Zapytanie:

  1. SELECT *
  2. FROM wyniki w
  3. LEFT JOIN bramki b ON w.MeczID = b.MeczID
  4. WHERE (MeczData BETWEEN data_od AND data_do) AND LigaID=coś


w miejsce gwiazdki musisz wpisać pola z obu tabel które chcesz pobrać

W ten sposób możesz pobrać wszystkie bramki dla każdego meczy meczu a warunek WHERE ogranicza ci mecze do wybranego przedziału czasowego i ligi.

W ten sposób dla każdego meczy dostaniesz tyle rekordów ile było bramek. masz zdublowane info o meczach na przykład jeśli w miejsce * wpiszesz:
w.MeczID,w.MeczData,w.GospodarzID,w.GoscID,w.BramkiGospodarz, w.BramkiGosc, b.Pilkarz, b.DruzynaID,b.Minuta

Dostaniesz coś w tym stylu

15 2008-04-12 druzynaA druzynaB 0 3 Kowalski druzynaB 9:12
15 2008-04-12 druzynaA druzynaB 0 3 Kowalski druzynaB 20:05
15 2008-04-12 druzynaA druzynaB 0 3 Nowak druzynaB 52:23
27 2008-04-13 druzynaC druzynaD 1 1 Mazurek druzynaC 16:49
27 2008-04-13 druzynaC druzynaD 1 1 Bal druzynaD 49:17

i tak dalej

Przeczesując rekordy pętlą możesz sobie ładnie te dane zapakować w jakieś tablice i potem nimi zarządzać.

Jedna uwaga. Zupełnie niepotrzebnie (moim zdaniem) masz zdublowane w tabeli bramki takie pola jak LigaID | SezonID
Wystarczy pole MeczID, które jednoznacznie łączy dany rekord z rekordem w tabeli wyniki gdzie te dane już są. Poczytaj trochę o redundancji danych smile.gif
Rafiki23
Dzięki smile.gif

Dzisiaj to przetestuje, coś podobnego spróbuję zrobić no i zobaczymy czy zadziała, jak nie to pokombinuje dalej smile.gif

Kombinowałem no i nie idzie... :/ Pokazuje mi się nadal tyle meczów ile mam strzelców. Może ktos znajdzie rozwiązanie? Wydaje mi się że wszystko jest ok...

  1. $get_matches1 = mysql_query("SELECT w.MeczID as id,
  2. w.SezonID as SezonID,
  3. w.LigaID as LigaID,
  4. w.MeczData as data,
  5. w.MeczGodzina as godzina,
  6. w.KolejkaMecz as kolejka,
  7. (SELECT d.DruzynaPelnaNazwa from druzyna d WHERE d.DruzynaID = w.GospodarzID) AS hometeam,
  8. (SELECT d.DruzynaPelnaNazwa from druzyna d WHERE d.DruzynaID = w.GoscID) AS awayteam,
  9. w.GospodarzID as team_a_ID,
  10. w.GoscID as team_b_ID,
  11. w.BramkiGospodarz as goals_home,
  12. w.BramkiGosc as goals_away,
  13. w.MeczUwagi as uwagi,
  14. b.MeczID as SMeczID,
  15. b.Pilkarz as Pilkarz,
  16. b.DruzynaID as SDruzynaID
  17. FROM mecze_$LigaID w
  18. LEFT JOIN gole b ON w.MeczID = b.MeczID
  19. AND w.LigaID = b.LigaID
  20. WHERE (
  21. w.MeczData
  22. BETWEEN '$minus2dni'
  23. AND '$plus3dni'
  24. )
  25. AND w.LigaID = '$LigaID'
  26. AND w.SezonID = '$SezonID' ORDER by w.MeczData ASC, w.MeczGodzina ASC",$lacz) or die(mysql_error());
  27.  
  28.  
  29. if(mysql_num_rows($get_matches1) <= 1)
  30.        {
  31.            echo "<table>";
  32.        }
  33.        else
  34.        {
  35.                              echo"<div align=\"center\">";?>
  36.              <center>
  37.            <br><table border="0" cellspacing="1" width="95%">
  38.            <?
  39.  
  40.            $i = 0;
  41.            $temp = '';
  42.            $ja = 0;
  43.            $tempja = '';
  44.  
  45.  
  46.            while($data = mysql_fetch_array($get_matches1))
  47.            {
  48.                if($i == 0)
  49.                {
  50.  
  51.  
  52.                  ?>
  53.              <tr>
  54.                <td width="100%" colspan="5"> <b><font size="2"><?php echo"$data[data]";?> 
  55.                  -  Kolejka nr <?php echo"$data[kolejka]";?></font></b></td>
  56.              </tr>
  57. <?php
  58.                }
  59.  
  60.                if($data['data'] != "$temp" && $i > 0)
  61.                {
  62. ?>
  63.              <tr>
  64.                <td width="100%" colspan="5"> <b><font size="2"><?php echo"$data[data]";?> 
  65.                  -  Kolejka nr <?php echo"$data[kolejka]";?></font></b></td>
  66.              </tr>
  67. <?php
  68.                }
  69.  
  70.  
  71.                if($ja == 0)
  72.                {
  73.  
  74.  
  75. ?>
  76. <tr>
  77.                  <td width="10%" align="center"><?php echo"$data[godzina]";?></td>
  78.                  <td width="37%"><b> <?php echo"$data[hometeam]";?></b></td>
  79.                  <td width="3%" align="center">-</td>
  80.                  <td width="37%"><b> <?php echo"$data[awayteam]";?></b></td>
  81.                  <td width="13%">
  82. <?php
  83.                if(!is_null($data['goals_home']))
  84.                    echo"<p align=\"center\"><b>$data[goals_home]: $data[goals_away]</b>";
  85. ?>
  86.                </td></tr>
  87.  
  88. <?php
  89.  
  90.  
  91.            if($data['uwagi']==''){}
  92.            else {
  93.  
  94. ?>
  95.              <tr>
  96.                <td width="100%" align="center" colspan="5">
  97.                <p align="left"> <i><font size="1"><?php echo"$data[uwagi]"; ?></font></i></td>
  98.              </tr>
  99. <?php
  100.                }}
  101.  
  102.                if($data['id'] == "$tempja" && $ja > 0)
  103.                {
  104. ?>
  105. <tr>
  106.                  <td width="10%" align="center"><?php echo"$data[godzina]";?></td>
  107.                  <td width="37%"><b> <?php echo"$data[hometeam]";?></b></td>
  108.                  <td width="3%" align="center">-</td>
  109.                  <td width="37%"><b> <?php echo"$data[awayteam]";?></b></td>
  110.                  <td width="13%">
  111. <?php
  112.                if(!is_null($data['goals_home']))
  113.                    echo"<p align=\"center\"><b>$data[goals_home]: $data[goals_away]</b>";
  114. ?>
  115.                </td></tr>
  116. <?php
  117.  
  118.  
  119.  
  120.            if($data['uwagi']==''){}
  121.            else {
  122.  
  123. ?>
  124.              <tr>
  125.                <td width="100%" align="center" colspan="5">
  126.                <p align="left"> <i><font size="1"><?php echo"$data[uwagi]"; ?></font></i></td>
  127.              </tr>
  128. <?php
  129.               }
  130.                $tempja = "$data[id]";
  131.  
  132.                $ja++;
  133.  
  134.                }
  135.  
  136.                $temp = "$data[data]";
  137.  
  138.                $i++;
  139.            }
  140.        }
  141.  
  142.        mysql_free_result($get_matches1);
JoShiMa
Cytat(Rafiki23 @ 10.09.2008, 14:52:29 ) *
Kombinowałem no i nie idzie... :/ Pokazuje mi się nadal tyle meczów ile mam strzelców. Może ktos znajdzie rozwiązanie? Wydaje mi się że wszystko jest ok...


Przecież pokazałam Ci czarno na białym że tyle meczów Ci pokaże. Dopiero analizując w pętli te rekordy możesz obrobić te dane. rozdzielając info o meczach i o strzelcach.
Rafiki23
Cytat(JoShiMa @ 10.09.2008, 15:41:41 ) *
Przecież pokazałam Ci czarno na białym że tyle meczów Ci pokaże. Dopiero analizując w pętli te rekordy możesz obrobić te dane. rozdzielając info o meczach i o strzelcach.

A możesz pokazać jakiś przykład, bo ciężko mi to jest wyobrazić... Jakieś kroki jak to spóbować zrobić...
JoShiMa
A jaka strukturę danych chcesz uzyskać?
Rafiki23
wszystko jedno smile.gif ważne żeby łatwo można było coś z tym zrobic smile.gif
JoShiMa
No sorry, ale ja Ci nie będę pisac całego skryptu. Powiedz jaką chcesz dostać strukturę danych to Ci podpowiem.
Rafiki23
Ogólnie to poza tym co wyżej pokazałem co chcę uzyskać, pod danym meczem chcę wypisać strzelców, dlatego najlepiej aby struktura danych wyglądała podobnie. Osobno mecze i osobno strzelcy
JoShiMa
Przykładowy kod adekwatny do wcześniejszego mojego kodu. W każdym razie ja bym tak zrobiła:

  1. <?php
  2. $wynik_zapytania = mysql_query($zapytanie);
  3. while($rekord = mysql_fetch_assoc($wynik_zapytania)) {
  4.    $mecze[$rekord['MeczID']] = array('data'   =>   $rekord['MeczData'],
  5.                                                      'gospodarz'   =>   $rekord['GospodarzID'],
  6.                                                      'gosc'   =>  $rekord['GoscID'],
  7.                                                      'bramki_gosp'   =>  $rekord['BramkiGospodarz'],
  8.                                                      'bramki_gosc'   =>  $rekord['BramkiGosc']);
  9.   $mecze[$rekord['MeczID']] [bramki][$rekord['DruzynaID']][] = array('strzelec'   =>  $rekord['Pilkarz'],
  10.                                                                                                     'minuta'   =>   $rekord['Minuta']);
  11. }
  12.  
  13. print_r($mecze); //wyswietlenie struktury danych
  14. ?>
Rafiki23
super smile.gif dzięki za przykład smile.gif
Już prawie udało mi się osiągnąć to co chcę 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.