Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Pobieranie danych z bazy pomijając takie same id.
Forum PHP.pl > Forum > Przedszkole
Gość.
Witam,

Potrzebuje pomocy...
Mam baze:
ga.id valu. cat. rating
5593 3886 05 93
5998 2385 07 92
5527 5530 15 92
0004 1154 07 92
0110 0138 17 92
0039 0317 11 90
0150 0153 17 90
0102 0147 19 90
0039 0317 07 90
0062 1202 15 90
0106 0300 07 90
0062 1202 04 90
5565 0257 12 88
5731 0266 05 88
0088 0249 16 88
0043 0151 11 88
0105 0121 17 88

korzystając z tego kodu:
$ocenagg = db::query("SELECT * FROM cache ORDER BY rating DESC LIMIT 24");

otrzymuje wyniki - jak zrobić gdy w kolumnie "g.id" jest to samo żeby już nie wyświetlał tego samego wyniku
(np.
0039 0317 11 90
0039 0317 07 90
mamy dwa razy 39) - potrzebuje zrobić tak żeby nie wyświetlał jedno znich.
Z góry dziękuję za pomoc.
cibeek
skoro masz takie same id w bazie to chyba cos nie tak . id powinno byc unikalne
Gość.
to jest id gry
wpisy do bazy są generowane w tej bazie automatycznie a powtarza się wpis ponieważ jest w dwuch lub trzech kategoriach ta sama gra (cat. - kategoria)
modern-web
Ehh.. szkoda, że muszę tłumaczyć nawet tak proste rzeczy...
Poczytaj o DISTINCT w języku SQL wink.gif a wszystko stanie się jasne...

Pozdrawiam!
Gość.
Cytat(modern-web @ 27.03.2011, 16:17:23 ) *
Ehh.. szkoda, że muszę tłumaczyć nawet tak proste rzeczy...
Poczytaj o DISTINCT w języku SQL wink.gif a wszystko stanie się jasne...

Pozdrawiam!



Jeśli użyje DISTINCT w tym zapytaniu to usunie powtarzające się wyniki z "rating" a to jest ocena gry w %
("SELECT * FROM cache ORDER BY rating DESC LIMIT 24");

A mi zależy na pominięciu takiego samego id gry (ga.id)

modern-web
Nie za bardzo rozumiem Twój tok myślenia.
Chcesz pominąć cały rekord który zawiera taki sam ga.id, czy jak?
Może mógłbyś sprecyzować na czym polega Twój problem i jak ma owy system funkcjonować.
Gość.
Cytat(modern-web @ 27.03.2011, 16:31:55 ) *
Chcesz pominąć cały rekord który zawiera taki sam ga.id, czy jak?


Tak...
"SELECT * FROM cache ORDER BY rating DESC LIMIT 24"
Potrzebuje z bazy "cache" 24 wyniki najwyższych z kolumny "rating" następnie wyciągam z tego "ga.id" id gry (jeśli się powtarza to chciałbym żeby nie wyświetlał) a pozostałe wyniki zostaną wykorzystane dalej.

ga.id valu. cat. rating
5593 3886 05 93 - ok
5998 2385 07 92 - ok
5527 5530 15 92 - ok
0004 1154 07 92 - ok
0110 0138 17 92 - ok
0039 0317 11 90 - ok
0150 0153 17 90 - ok
0102 0147 19 90 - ok
0039 0317 07 90 - już mam id 39 - pomija
0062 1202 15 90 - ok
0106 0300 07 90 - ok
0062 1202 04 90 - już jest powyżej
5565 0257 12 88 - ok
5731 0266 05 88 - ok
0088 0249 16 88 - ok
0043 0151 11 88 - ok
0105 0121 17 88 - ok
jaslanin
Kod
SELECT *, count(gaid) countId FROM cache GROUP BY gaid HAVING countId=1
Valdi_B
To co proponuje Jaslanin wyeliminuje te "gaid" za które masz > 1 wiersz.
Ty natomiast chcesz z takich "powtórzonych" wierszy wyciągnąć jeden.

Spróbuj coś takiego:

SELECT gaid, valu, cat, rating
FROM cache
GROUP BY gaid;

Uwaga: W razie użycia GROUP BY niektóre systemy baz danych wymagają aby każda kolumna:
1. Albo była ujęta we frazie GROUP BY.
2. Albo była ujęta w liście SELECT z jakąś funkcją agregującą.

W MySQL - jak widzę - takiego wymagania nie ma (co jest "trochę nieczyste koncepcyjnie", ale chodzi).
Czasem (np. w MS Access) jest funkcja agregująca First i Last, ale w dokumentacji MySQL tych funkcji nie widzę.

Edit:
Jeszcze trochę poeksperymentowałem i doszedłem do czegoś takiego:
  1. SELECT c3.* FROM (
  2. SELECT DISTINCT gaid
  3. FROM cache
  4. ORDER BY rating DESC
  5. LIMIT 24 ) AS c1
  6. LEFT JOIN (
  7. SELECT gaid, max(rating) AS r
  8. FROM cache
  9. GROUP BY gaid ) AS c2
  10. ON c1.gaid = c2.gaid
  11. LEFT JOIN cache AS c3
  12. ON c2.gaid = c3.gaid AND c2.r = c3.rating
  13. GROUP BY gaid
  14. ORDER BY rating DESC
Pierwsze subkwerenda wybiera 24 gaid'y z największymi ratingami.
Druga doszukuje te ratingi.
Dopiero trzecia wyszukuje pełne wiersze.
Gość.
Dziękuję wszystkim ...
Początek kodu mi wystarczy:

$ocenagg = db::query("SELECT DISTINCT(gameid) FROM cache ORDER BY rating DESC LIMIT 24");
while($witem = $ocenagg->fetch_assoc()){
$id = $witem['gameid'];

Dziękuję wszystkim za pomoc...

Możecie mi jeszcze podpowiedzieć jak zadać pytanie do bazy żeby pokazał wszystkie wyniki z danego dnia
ale w bazie (date) mam zapisne tak:
2011-01-31 03:16:52
2011-01-31 03:16:54
2011-01-31 03:18:11
2011-01-31 03:18:13

Chciałbym żeby pokazał wszystkie z 2011-01-31 z wszystkich godzin w tym dniu.
próbowałem tak ale nie działa.
$ocenagg = db::query("SELECT * FROM stats WHERE date=('2011-03-27 23:59:59.999999', '1 1:1:1.000002')");
melkorm
Kod
$date = date('Y-m-d');
where DATE(date) = $date


jeżeli chcesz inne dni to zapraszam do manuala i funkcji strtotime.
Gość.
Cytat(melkorm @ 28.03.2011, 19:15:50 ) *
Kod
$date = date('Y-m-d');
where DATE(date) = $date


jeżeli chcesz inne dni to zapraszam do manuala i funkcji strtotime.


Możesz napisać jak użyć tej funckji "strtotime" potrzebuje dzień wcześniejszy czyli
Dziś 28 a jak zrobić 27 questionmark.gif
melkorm
RTFM

Wprzykładach wszystko jest, nawet następny dzień, a poprzedni robi się adekwatnie.
+ drugi parametr funkcji date.
zegarek84
Kod
$date = date('Y-m-d', time() - 60*60*24*$liczba_dni);

moim zdaniem skorzystanie z date dla Kolegi będzie bardziej intuicyjne - podobny przykład w manualu pod funkcją time -> 1 dzień = 60s*60min*24h...
Gość.
Cytat(melkorm @ 28.03.2011, 20:03:15 ) *
RTFM
Wprzykładach wszystko jest, nawet następny dzień, a poprzedni robi się adekwatnie.
+ drugi parametr funkcji date.


Użyłem tego:

$date = strtotime ("-1 day");
$ocenagg = db::query("SELECT * FROM stats WHERE DATE(date)='$date'");

i nie działa...
mat-bi
A nie lepiej użyć funkcji MySQL-a?

  1. SELECT * FROM stats WHERE date = DATE_SUB(CUR_DATE(), INTERVAL 1 DAY)
Gość.
Cytat(zegarek84 @ 28.03.2011, 20:47:19 ) *
Kod
$date = date('Y-m-d', time() - 60*60*24*$liczba_dni);

moim zdaniem skorzystanie z date dla Kolegi będzie bardziej intuicyjne - podobny przykład w manualu pod funkcją time -> 1 dzień = 60s*60min*24h...


Użyłem tego kodu
$date = date('Y-m-d', time() - 60*60*24);
$ocenagg = db::query("SELECT * FROM stats WHERE DATE(date)='$date'");

Pokazuje tylko z tego dnia ale tylko 1 godz. (między 00 a 01 godz.)

2011-03-27 00:02:58
2011-03-27 00:03:51
...
2011-03-27 00:47:37
2011-03-27 00:49:32
Gość.
Cytat(mat-bi @ 28.03.2011, 20:52:37 ) *
  1. SELECT * FROM stats WHERE date = DATE_SUB(CUR_DATE(), INTERVAL 1 DAY)


Nie wiem dlaczego ale mi to nie działa, próbowałem nawet: DATE_SUB(CURDATE(), INTERVAL 1 DAY)

To działa prawidłowo:
$date = date('Y-m-d', time() - 60*60*24*$liczba_dni);
Wcześniej miałem proble ponieważ było ograniczenie if($i == 21)
i myślałem że tylko pokazuje z jednej godziny.
Gość.
Panowie jak już mam wyniki z danego dnia

id game_id date
87 5977 2011-03-27 00:15:21
89 5977 2011-03-27 00:16:52
99 3477 2011-03-27 00:17:30

jak zliczyć ile razy jest (np "game_id" 5977) i po zliczeniu wyświetlić malejąco

Do wyświetlenia wyniku użyłem kody:
$date = date('Y-m-d', time() - 60*60*24);
$ocenagg = db::query("SELECT * FROM stats WHERE DATE(date)='$date'");

Dziękuję za wszystkie odpowiedzi.
zegarek84
jeśli nie potrzebowałeś tych danych wcześniej obrabiać w php to lepiej to policzyć i posortować w bazie danych - jesli jednak potrzebowałeś coś robić z tymi danymi to te dane gdy przelatywałeś w pętli przepisz dodatkowo np. do tablicy po kluczu game_id i o ile w tablicy znajduje się taki klucz z wartością początkową 1 to następnymi razami dajesz ++$aTab[$iKey]... czyli w deseń:
$aTab = array();
forech...{//czy tam inna pętla po wynikach z bazy
if(!isset($aTab[$iKey_game_id])){$aTab[$iKey_game_id]=1;}else{++$aTab[$iKey_game_id];}
// i inne operacje na danych z tablicy
}

jednak jesli wystarczy gotowy wynik z bazy to zapytanie w stylu:
"SELECT *, count(*) AS ile FROM stats WHERE DATE(date)='$date' GROUP BY game_id ORDER BY ile DESC"
Gość.
Cytat(zegarek84 @ 28.03.2011, 22:24:51 ) *
"SELECT *, count(*) AS ile FROM stats WHERE DATE(date)='$date' GROUP BY game_id ORDER BY ile DESC"


zegarek84 dziękuję Tobie i innym za pomoc.

Mam jeszcze jeden problem z tym: pokazuje taki błąd

Warning: implode() [function.implode]: Invalid arguments passed in /homez.90/lxcrgqus/gry/app/najczesciejgrane.php on line 47

oto kod:
  1. $date = date('Y-m-d', time() - 60*60*24);
  2. $ocenagg = db::query("SELECT *, count(*) AS ile FROM stats WHERE DATE(date)='$date' GROUP BY game_id ORDER BY ile DESC LIMIT 24");
  3. while($witem = $ocenagg->fetch_assoc()){
  4. $id = $witem['gameid'];
  5. $ocegry = db::query("SELECT * FROM games WHERE id=$id");
  6. //tutaj ma zbierac dane jako $c_dane[]
  7. $i = 1;
  8. $count = db::rows();
  9. IF($count > 0) {
  10. while($eitem = $ocegry->fetch_assoc()) {
  11. $c_dane[] = '<dl class="game-box1">
  12. <dt><a title="'.$eitem['nazwa'].' - '.validator::cut($eitem['opis'],400).'" href="'.game::link($eitem['id']).'">'.validator::cut($eitem['nazwa'],25).'</a></dt>
  13. <dd><a href="'.game::link($eitem['id']).'" onMouseOver=\'rollover'.$eitem['id'].'.src="./template/img/graj.jpg"\' onMouseOut=\'rollover'.$eitem['id'].'.src="./a/obrazki/'.$eitem['plik'].'.w5.jpg"\'><img src="./a/obrazki/'.$eitem['plik'].'.w5.jpg" title="'.$eitem['nazwa'].' - '.validator::cut($eitem['opis'],400).'" name="rollover'.$eitem['id'].'" width="110" height="70"/></a></dd>
  14. </dl>';
  15. IF($i == 21) {
  16. break;
  17. }
  18. $i++;
  19. }
  20. } // przeladowanie danych
  21. echo $c_fp_dane = fopen($cacheR_adres,"w+");
  22. fputs($c_fp_dane,implode("",$c_dane));
  23. fclose($c_fp_dane);
  24. $fp = fopen($cacheR_czas,"w");
  25. fputs($fp,time());
  26. fclose($fp);


Proszę kolejny raz o pomoc...Dzięki
Gość.
zapomniałem napisać że ten błąd
Warning: implode() [function.implode]: ... on line 47

47 -> fputs($c_fp_dane,implode("",$c_dane));

oraz nad wcześniejszym kodem jest to:
  1. $cacheR_czas = './cache/najczesciejgrane.czas';
  2. $cacheR_odswiez = 1*24*60*60; // czas odswiezania listy rankingowej - 5 dni domyslnie
  3. $cacheR_adres = './cache/najczesciejgrane.htm'; //adres zrzutu
  4. IF(!file_exists($cacheR_czas)) {
  5. $fp = fopen($cacheR_czas,"w+");
  6. fputs($fp,time());
  7. fclose($fp);
  8. }
  9. else
  10. {
  11. $fp = fopen($cacheR_czas,"r");
  12. $cacheR_ost_zrzut = fgets($fp,11);
  13. fclose($fp);
  14. IF((time()-$cacheR_ost_zrzut>$cacheR_odswiez)) {
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.