Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Pobieranie danych z bazy pomijając takie same id., Pobieranie danych z bazy pomijając takie same id.
-Gość.-
post
Post #1





Goście







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.
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
cibeek
post
Post #2





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 17.06.2010

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


skoro masz takie same id w bazie to chyba cos nie tak . id powinno byc unikalne
Go to the top of the page
+Quote Post
-Gość.-
post
Post #3





Goście







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)
Go to the top of the page
+Quote Post
modern-web
post
Post #4





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


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!


--------------------
Pomogłem? Kliknij `Pomógł`. To nic nie kosztuje, a mnie usatysfakcjonuje! ;)
Go to the top of the page
+Quote Post
-Gość.-
post
Post #5





Goście







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)

Go to the top of the page
+Quote Post
modern-web
post
Post #6





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


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ć.

Ten post edytował modern-web 27.03.2011, 16:32:25


--------------------
Pomogłem? Kliknij `Pomógł`. To nic nie kosztuje, a mnie usatysfakcjonuje! ;)
Go to the top of the page
+Quote Post
-Gość.-
post
Post #7





Goście







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
Go to the top of the page
+Quote Post
jaslanin
post
Post #8





Grupa: Zarejestrowani
Postów: 511
Pomógł: 143
Dołączył: 13.03.2010
Skąd: Jasło

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


Kod
SELECT *, count(gaid) countId FROM cache GROUP BY gaid HAVING countId=1


Ten post edytował jaslanin 27.03.2011, 16:53:22


--------------------
Good luck and happy PHP'ing
Go to the top of the page
+Quote Post
Valdi_B
post
Post #9





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

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


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.


Ten post edytował Valdi_B 27.03.2011, 17:55:16
Go to the top of the page
+Quote Post
-Gość.-
post
Post #10





Goście







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')");
Go to the top of the page
+Quote Post
melkorm
post
Post #11





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


Kod
$date = date('Y-m-d');
where DATE(date) = $date


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

Ten post edytował melkorm 28.03.2011, 19:16:50


--------------------
Go to the top of the page
+Quote Post
-Gość.-
post
Post #12





Goście







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
Go to the top of the page
+Quote Post
melkorm
post
Post #13





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


RTFM

Wprzykładach wszystko jest, nawet następny dzień, a poprzedni robi się adekwatnie.
+ drugi parametr funkcji date.


--------------------
Go to the top of the page
+Quote Post
zegarek84
post
Post #14





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


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...


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
-Gość.-
post
Post #15





Goście







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...
Go to the top of the page
+Quote Post
mat-bi
post
Post #16





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

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


A nie lepiej użyć funkcji MySQL-a?

  1. SELECT * FROM stats WHERE date = DATE_SUB(CUR_DATE(), INTERVAL 1 DAY)
Go to the top of the page
+Quote Post
-Gość.-
post
Post #17





Goście







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 to the top of the page
+Quote Post
-Gość.-
post
Post #18





Goście







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 to the top of the page
+Quote Post
-Gość.-
post
Post #19





Goście







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.
Go to the top of the page
+Quote Post
zegarek84
post
Post #20





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


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"


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Aktualny czas: 19.08.2025 - 21:56