Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql][php]porównanie danych z tablicy
Forum PHP.pl > Forum > Przedszkole
srwsio
Witam jestem początkującym programista i prosze nie krzyczeć na mnie.
Otórz chcę wyciągnąć z bazy najwieksza różnicę 2 poł tj

Mamy
table_wyniki
id team1 team2 score1 score2 sid - gdzie sid to sezon id

chcę aby wywaliło mi mecz w którym jest największa róznica między score1 a score2.
dane wyciągam tak
  1. $result= SELECT * FROM table_wyniki WHERE sid=2;

ale jak wziąść i znaleźć największą róznice miedzy tymi polami score??
znajomy podsunął mi że trzeba zrobić poprzez tablicę
Czy znalazłby się ktoś taki dobry i wskazął jak to zrobić
Skobi
tak powinno zadzialac:

  1. SELECT max(score2-score1) AS roznica FROM table_wyniki WHERE sid=2
srwsio
Resource id #298 - takie coś mi wywaliło w miejscu wstawienia wyniku z zapytania
mike
Cytat(srwsio @ 11.10.2006, 12:34:13 ) *
Resource id #298 - takie coś mi wywaliło w miejscu wstawienia wyniku z zapytania

Pewnie zrobiłes gdzieś błąd.
Jeśli nie pokażesz kodu to pozostanie nam wróżyć z fusów tongue.gif

P.S.
Proszę poprawić temat wątku.
Nie jest zgodny z zasadami panującymi na forum Przedszkole
nospor
Cytat
Pewnie zrobiłes gdzieś błąd.
Jaki blad, pewnie zrobil tak:
  1. <?php
  2. $zap = 'tutaj zapytanie';
  3. ?>

Ino jest maly problem... zobacz w manualu co zwraca mysql_query() i co nalezy potem z tym zrobic smile.gif

edit:
@majki, to nie błąd a niedouczenie winksmiley.jpg
mike
Cytat(nospor @ 11.10.2006, 12:48:52 ) *
Jaki blad, pewnie zrobil tak: (...)

No to właśnie mówię.
Przecież pisanie takich głupot to też jest błąd tongue.gif
srwsio
Witam
moja tabela wygląda powiedzmy tak
table_wyniki
id team1 team2 score1 score2 sid - gdzie sid to sezon id
1 1 2 3 0 1
2 3 4 6 1 1
3 2 3 5 0 1
4 4 1 1 1 1

i teraz po zapytaniu powinno zwrócić mi id meczu 2 i 3 poniewaz tam jest największa róznica bramek.
Cytat("nospor")
zobacz w manualu co zwraca mysql_query()

wiem że do tego trzeba użyć fetchrow lub array ale własnie nie wiem jak.
Moje zapytanie wygląda tak
  1. <?php
  2. $result = $db->sql_query("select max(score2-score1) as roznica from ".$prefix . "_league_schedule where sid=$sid");
  3. echo"<Center> <strong> $result </strong></center>";
  4. ?>
i wywala mi powyższy błąd ten co napisałem
lub tak ale wtedy nic się nie wyświetla ( brak wyników ani błędu)

  1. <?php
  2. global $db;
  3. $sid=2;
  4. $result = $db->sql_query("select id, tid1, tid2, score1, score2 FROM ".$prefix ."_league_schedule WHERE (score1, score2) IN (select max(score2-score1) as roznica from ".$prefix ."_league_schedule where sid=2)");
  5.  
  6. while ($row = $db->sql_fetchrow($result)){
  7. $tid1=$row['tid1'];
  8. $tid2=$row['tid2'];
  9. $score1=$row['score1'];
  10. $score2=$row['score2'];
  11.  
  12. echo"<Center> <strong>Najwyższe zwycięstwo to $tid1 vs $tid2 a wynik to $score1:$score2 </strong></center>";
  13. }
  14. ?>


czy znalazłby się ktos kto zna rozwiązanie questionmark.gif
phpion
  1. <?php
  2. $array = Array();
  3. $i = 0;
  4.  
  5. $q = 'SELECT id, team1, team2 FROM table_wyniki WHERE ABS(score2-score1)=(SELECT MAX(ABS(score2-score1)) FROM table_wyniki)';
  6. $q = mysql_query($q);
  7.  
  8. if (mysql_num_rows($q) > 0)
  9. while ($r = mysql_fetch_row($q))
  10. {
  11. $array[$i]['id'] = $r[0];
  12. $array[$i]['team1'] = $r[1];
  13. $array[$i]['team2'] = $r[2];
  14. $i++;
  15. }
  16. ?>
  17. <pre>
  18. <?php print_r($array); ?>
  19. </pre>

Powinno zadzialac (mam nadzieje, ze w php mozna wykorzystywac podzapytania SQL tongue.gif) - nie testowalem! Jesli jednak nie bedzie hulac rozbij $q na dwa zapytania i wtedy powinno byc juz ok.

PS: wszyscy szanowni panowie koledzy zapomnieli o takim czyms jak wartosc bezwzgledna roznicy (ABS) bo co w przypadku gdy team1 strzeli np. 10 bramek, team2 tylko 1? score2 - score1 = -9 Chodzi o bezwzgledna roznice ilosci bramek!
smile.gif
srwsio
teraz takie coś wyskoczyło
  1. <?php
  2. (
  3. )
  4. ?>

ale to chyba mój błąd już ( chciałem się coś nauczyć i dojść samemu lecz nie udało się)
zapodaję jak ta tabela w rzeczywistości wyglada
jej budowa to
  1. CREATE TABLE `nuke_league_schedule` (
  2. `id` int(10) NOT NULL AUTO_INCREMENT,
  3. `gid` varchar(20) DEFAULT NULL, -- game id
  4. `daynum` smallint(2) UNSIGNED DEFAULT '0', --nr kolejki
  5. `sid` int(10) NOT NULL DEFAULT '0', -- sezon id
  6. `did` int(10) NOT NULL DEFAULT '0', -- division id
  7. `tid1` int(10) NOT NULL DEFAULT '0', -- team1 id
  8. `tid2` int(10) NOT NULL DEFAULT '0', -- team2 id
  9. `score1` int(10) DEFAULT NULL, -- score1
  10. `score2` int(10) DEFAULT NULL, -- score2
  11. `whenisit` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', -- kiedy rozegrano
  12. `plid` int(10) UNSIGNED DEFAULT '0', -- player id
  13. `matchreport1` int(11) DEFAULT NULL, -- gosp raport meczu
  14. `matchreport2` int(11) DEFAULT NULL, -- gośc raport meczu
  15. `options` int(11) UNSIGNED DEFAULT '0', -- opcje
  16. PRIMARY KEY (`id`),
  17. KEY `id` (`id`),
  18. KEY `sid` (`sid`)
  19. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=575 ;
  20.  
  21. INSERT INTO `nuke_league_schedule` VALUES (1, 1, 1, 1, 0, 2, 1, 2, 0, '2005-08-14 15:00:00', 0, NULL, NULL, 0);
  22. INSERT INTO `nuke_league_schedule` VALUES (2, 2, 1, 1, 0, 3, 8, 0, 0, '2005-08-14 15:00:00', 0, NULL, NULL, 0);
  23. INSERT INTO `nuke_league_schedule` VALUES (3, 3, 1, 1, 0, 7, 14, 5, 0, '2005-08-14 15:00:00', 0, NULL, NULL, 0);
  24. INSERT INTO `nuke_league_schedule` VALUES (4, 4, 1, 1, 0, 6, 5, 1, 3, '2005-08-14 15:00:00', 0, NULL, NULL, 0);
  25. INSERT INTO `nuke_league_schedule` VALUES (5, 5, 1, 1, 0, 13, 10, 2, 2, '2005-08-14 15:00:00', 0, NULL, NULL, 0);
  26. INSERT INTO `nuke_league_schedule` VALUES (6, 6, 1, 1, 0, 4, 12, 5, 0, '2005-08-14 15:00:00', 0, NULL, NULL, 0);
  27. INSERT INTO `nuke_league_schedule` VALUES (7, 7, 1, 1, 0, 9, 11, 3, 1, '2005-08-14 15:00:00', 0, NULL, NULL, 0);
  28. INSERT INTO `nuke_league_schedule` VALUES (8, 8, 2, 1, 0, 1, 9, 3, 0, '2005-08-21 15:00:00', 0, NULL, NULL, 0);
  29. INSERT INTO `nuke_league_schedule` VALUES (9, 9, 2, 1, 0, 8, 12, 4, 1, '2005-08-21 15:00:00', 0, NULL, NULL, 0);
  30. INSERT INTO `nuke_league_schedule` VALUES (10, 10, 2, 1, 0, 11, 4, 3, 0, '2005-08-21 15:00:00', 0, NULL, NULL, 0);

czyli teoretycznie powinno mi wyciągnąć 3 i 6 insert
pozdrawiam

  1. <?php
  2. $row2 = $db->sql_query("SELECT * FROM ".$prefix ."_league_schedule WHERE sid=2 AND ABS(score2-score1)=$db->sql_query(SELECT MAX(ABS(score2-score1)) FROM ".$prefix ."_league_schedule)");
  3. ?>

oki doszedłem dolaczego chyba to nie dział - nie wiem do końca tylko to moja teoria. mam mysql w wersji 4.1 a ta podobno słabo wykonuje podzapytania. Starałem się to przerobić na left jointy ale jakoś nei potrafię. Czy mógłbym kogoś o to prosić??
phpion
Moze po prostu:
team1 -> tid1
team2 -> tid2
? smile.gif Jesli jednak problem lezy w podzapytaniach to tak jak sugerowalem - rozbij na 2 osobne zapytania. 1 wybierzesz maxymalna roznice, a w drugim w warunku juz podasz ta zmienna.
srwsio
czyli to :
  1. <?php
  2. $row2 = $db->sql_query("SELECT * FROM ".$prefix ."_league_schedule WHERE sid=2 AND ABS(score2-score1)=$db->sql_query(SELECT MAX(ABS(score2-score1)) FROM ".$prefix ."_league_schedule)");
  3. ?>

rozbić tak??

  1. <?php
  2. // wyciągam największa róznicę wg id 
  3. $row2 = $db->sql_query("select id from ".$prefix ."_league_schedule where sid=2 AND MAX(ABS(score2-score1))");
  4. // wyciągam id według zapisanej zmiennej $row2 
  5. $row3 = $db->sql_query('select * from ".$prefix ."_league_schedule where id=$row2");
  6. ?>



czy dobrze to rozbiłem questionmark.gif Ewentualnie prosze o odpowiedź
phpion
O ile metoda sql_query() wykona i ZWROCI dane z zapytania to cos takiego. Wersja proceduralna:
  1. <?php
  2. $array = Array();
  3. $i = 0;
  4.  
  5. $q = 'SELECT MAX(ABS(score2-score1)) FROM '.$prefix .'_league_schedule';
  6. $q = mysql_query($q);
  7. $max = mysql_result($q, 0);
  8.  
  9. $q = 'SELECT id, tid1, tid2 FROM '.$prefix .'_league_schedule WHERE ABS(score2-score1)='.$max;
  10. $q = mysql_query($q);
  11.  
  12. if (mysql_num_rows($q) > 0)
  13. while ($r = mysql_fetch_row($q))
  14. {
  15. $array[$i]['id'] = $r[0];
  16. $array[$i]['team1'] = $r[1];
  17. $array[$i]['team2'] = $r[2];
  18. $i++;
  19. }
  20. ?>
  21. <pre>
  22. <?php print_r($array); ?>
  23. </pre>
srwsio
nie wiem jak ale udało mi się dojśc do tego jak powinno to wyglądać
  1. <?php
  2. $sid=2;
  3. $q = $db->sql_query("SELECT MAX(ABS(score2-score1)) FROM nuke_league_schedule where sid=$sid");
  4. $q = $db->sql_fetchrow($q, 0);
  5. $roznica=$q[0];
  6. $row2 = $db->sql_query("SELECT * FROM ".$prefix ."_league_schedule WHERE sid=2 AND ABS(score1 - score2)=$roznica");
  7.  while ($row = $db->sql_fetchrow($row2)) {
  8.  $id=$row['id'];
  9.  $tid1=$row['tid1'];
  10.  $tid2=$row['tid2'];
  11.  $score1=$row['score1'];
  12.  $score2=$row['score2'];
  13.  
  14.  
  15. echo"Mecz ID to : $id , pomiędzy $tid1 a $tid2 a wynik to $score1 : $score2 <br />";
  16. }
  17. ?>


phpion.com dzięki wielkie 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.