sql abfrage

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Andi1111
Mitglied
Beiträge: 1301
Registriert: 26.05.2006 13:21
Wohnort: Berlin
Kontaktdaten:

sql abfrage

Beitrag von Andi1111 »

Hallo, ich mache gerade meine ersten Programmierversuche, also ich möchte eine Liste haben in der meine Spiele und der aktuelle Highscore stehen. im Moment bin ich so weit

http://www.das-gameboard.de/forum/games2.php

meine abfrage sieht so aus:

Code: Alles auswählen

$template->set_filenames(array('body' => 'games.tpl'));
$sqlString= $sql="SELECT s.game_name, u.user_id, u.username AS player, s.player_id, s.score, g.game_id, g.game_desc
      FROM phpbb_ina_scores s, phpbb_ina_games g, phpbb_users u
      WHERE u.user_id = s.player_id AND s.game_name = g.game_desc
      ORDER BY game_name ASC";
$rs=mysql_query($sqlString);
while ($line = mysql_fetch_array($rs))
{

   $template->assign_block_vars("total",array(
      "U_GAME_PLAY" => append_sid("./activity.php?mode=game&id=" . $line["game_id"]),
      "NAME" => $line["game_desc"],
      "SPIELER" => $line["player"],
      "SCORE" => $line["score"]
   ));
}
Meine Fragen dazu:
1. Das Wichtigste wär ob es möglich ist das nur der erste Platz angezeigt wird, jetzt werden alle Plätze angezeigt, also wenn ein Spiel 10 mal in diesem Monat gespielt wurde stehen alle 10 Scores in der Liste.

2. Schön wär es auch wenn alle Spiele angezeigt werden und nicht nur die bei denen es schon einen Highscore gibt.

3. Mich stören die 4 Nullen hinter dem Komma ein wenig, kann man die irgendwie wegkriegen?

So das war schon alles :D seit bitte nicht so streng, wie gesagt das ist mein erster Versuch was eigenes zu machen :)
Benutzeravatar
metty84
Mitglied
Beiträge: 159
Registriert: 08.03.2007 13:13
Wohnort: Marienberg
Kontaktdaten:

Beitrag von metty84 »

na das sind ja gleich mal einige fragen, aber ich versuche dir möglichst hilfreiche infos zu geben.

zu 1.:

dafür gibt es den sqlbefehl GROUP BY damit lassen sich datensätze anhand einer spalte zusamenfassen in deinem fall wäre es dan so wohl so

GROUP BY g.game_id

damit wird jedes spiel nur einmal in der liste erscheinen. das problem ist aber das er danaus den zusammengefasten werten zufällig einen auswählt der ausgegeben wird da du aber sicherlich den höchsten haben willst must du in der selectanwesund das s.score durch ein max(s.score) ersetzen damit gibt er den größten der zusammengefasten werte wieder.

zu 2.

dafür soltest du dich mit outerjoins befassen also relationeller algebra damit ist dies problemlos möglich. welche abfrage du genau willst must du dir selbst herassuchen aber hier http://de.wikibooks.org/wiki/Relationen ... Outer-Join ist das sehr gut erklärt.

zu 3. mit der php-funktion round() dürfte dir geholfen sein
einfach so:
"SCORE" => round($line["score"])

als kleine anregung kann ich dir ne sqlabfrage geben die ich letztlich für ne portalbox für nen blog gebastelt habe:

Code: Alles auswählen

SELECT b.id, b.title, max((CASE WHEN c.comment_time > 0 THEN c.comment_time ELSE b.time END)) AS timestamp 
         FROM orion_blogs_blogs AS b 
         LEFT OUTER JOIN orion_blogs_comments AS c ON b.id = c.comment_ad_id 
         group by id 
         ORDER BY timestamp DESC 
         LIMIT 7
mfg metty

P.S.: rückmeldung wäre nett
Nichts auf der welt ist so gerecht verteilt wie der Verstand.Denn jederman ist überzeugt das er genug davon habe.
Andi1111
Mitglied
Beiträge: 1301
Registriert: 26.05.2006 13:21
Wohnort: Berlin
Kontaktdaten:

Beitrag von Andi1111 »

schönen dank schonmal, ich probiere das morgen, mir ist aber noch was komisches aufgefallen, es werden nicht alle spiuele angezeigt bei denen es schon einen highscore gibt, auch wenn ich nur die highscore tabelle abfrage. ich habe das so versucht:

Code: Alles auswählen

$sql="SELECT highscore_year,highscore_mon,highscore_game,highscore_player,highscore_ score
FROM phpbb_ina_highscore
WHERE highscore_year = 2008 AND highscore_mon = 2
ORDER BY highscore_player ASC";
fehlen etliche ergebnisse obwohl sie in der datenbank stehen. ich stehe z.b. nur einmal in meiner liste, habe aber 7 highscores. hast du auch ne idee warum nicht alle daten die da sind angezeigt werden?
Benutzeravatar
metty84
Mitglied
Beiträge: 159
Registriert: 08.03.2007 13:13
Wohnort: Marienberg
Kontaktdaten:

Beitrag von metty84 »

also deine abfrage zeigt nur spiele an mit highscore deren highscore im februar 2008 liegt. und was soll angezeigt werden?
Nichts auf der welt ist so gerecht verteilt wie der Verstand.Denn jederman ist überzeugt das er genug davon habe.
Andi1111
Mitglied
Beiträge: 1301
Registriert: 26.05.2006 13:21
Wohnort: Berlin
Kontaktdaten:

Beitrag von Andi1111 »

genau das, also die monatshighscores, ist aber bei allen abfragen das gleiche, es werden nicht alle spiele angezeigt. also das in der scores tabelle sind auch die monatshighscores, weil ich die immer am 1. auf 0 stelle..
Benutzeravatar
metty84
Mitglied
Beiträge: 159
Registriert: 08.03.2007 13:13
Wohnort: Marienberg
Kontaktdaten:

Beitrag von metty84 »

ja laut deiner sqlabfrage werden spiele die keinen highscore im februar 2008 haben nicht angezeigt


und bei dem problem aus dem ersten posting deshalb mit outer join arbeiten den wen du nur mit innerjoins arbeitest oder die tabellen so ausliest werden datensätze nicht angezeigt bei denen in einer der beiden tabellen kein eintrag existiert

jetzt mal als erklärung:
wen du schreibst
select *
FROM a, b
where a.daten_id = b.info_id

und deine tabelle a sieht so aus:

daten_id---daten
1-----------daten 1
2-----------daten 2
3-----------daten 3
5-----------daten 5

und die tabelle b so:

info_id---info
1---------info 1
2---------info 2
4---------info 4


bekomst du folgende tabelle als ergebniss:

daten_id------daten----info_id------info--
----1---------daten 1------1---------info 1
----2---------daten 2------2---------info 1

den:
die info_id 3 gibt es in tabele b nicht deshalb kan die where klausel nicht erfüllt werden
die daten_id 4 gibt es in tabele a nicht deshalb keine übereinstimmung der ids(das selbe wie bein info_id3 nur mit vertauschten tabellen)
und info_id 4 gibt es ebenfals in tabelle b nicht deshalb exakt das selbe problem wie bei info_id 3

um diese probleme zu umgehen kannst du nur mit outer join arbeiten
Nichts auf der welt ist so gerecht verteilt wie der Verstand.Denn jederman ist überzeugt das er genug davon habe.
Andi1111
Mitglied
Beiträge: 1301
Registriert: 26.05.2006 13:21
Wohnort: Berlin
Kontaktdaten:

Beitrag von Andi1111 »

ja gut, damit muss ich mich noch beschäftigen, das erklärt aber nicht warum auch etliche ergebnisse fehlen wenn ich nur die tabelle phpbb_ina_highscore abfrage, da stehen die aber alle drin.

na ja ich versuche es morgen weiter, vielleicht habe ich auch nur vorhin was übersehen.

schönen dank schonmal für deine hilfe.
Andi1111
Mitglied
Beiträge: 1301
Registriert: 26.05.2006 13:21
Wohnort: Berlin
Kontaktdaten:

Beitrag von Andi1111 »

Ich habs tatsächlich geschafft, also jetzt siehts so aus:

SELECT s.highscore_year, s.highscore_mon, s.highscore_game, s.highscore_player, s.highscore_score, g.game_desc, game_id
FROM phpbb_ina_highscore s, phpbb_ina_games g
WHERE s.highscore_year = 2008 AND s.highscore_mon = 2 AND s.highscore_game = g.game_name
ORDER BY highscore_player ASC, highscore_game ASC

mein fehler war hier AND s.highscore_game = g.game_name

ich hatte AND s.highscore_game = g.game_desc deswegen wurden nur die spiele angezeigt bei denen dateiname und der name der im forum angezeigt wird gleich sind, ich haber aber einige umbenannt.

nochmal herzlichen dank an metty, ohne deinen tipp das ja nich alle daten in allen tabellen stehen wär ich wohl nie drauf gekommen :)

Jetzt habe ich dafür wieder 2 neue fragen :D
also gibts ne möglichkeit nachkommastellen anzuzeigen wenn welche da sind? mit number_format kann ich zwar die anzahl festlegen, aber dann sind immer welche da auch wenn sie nicht gebraucht werden, und mit round() sind nie welche da auch wenns eigendlich welche gibt. ist aber nicht so wichtig,es sind nur wenige spiele die ergebnisse mit nachkommastellen haben.

und kann man irgendwie hier WHERE highscore_year = 2008 AND highscore_mon = 2 jahr und monat automatisch einsetzen? ist zwar kein problem die zeile jeden monat zu ändern, abber ich bin ja faul :D
Benutzeravatar
metty84
Mitglied
Beiträge: 159
Registriert: 08.03.2007 13:13
Wohnort: Marienberg
Kontaktdaten:

Beitrag von metty84 »

zum runden siehe da:
http://www.selfphp.info/funktionsrefere ... /round.php

mit der funktion date() kanst du ein datum formatieren
den monat als zahl wiedergeben kannst du da mit "n"
unddie funktiontime() gibt dir dden akuelen unix.timestamp

sähe dan also so aus:

Code: Alles auswählen

date(n, time());
Nichts auf der welt ist so gerecht verteilt wie der Verstand.Denn jederman ist überzeugt das er genug davon habe.
Andi1111
Mitglied
Beiträge: 1301
Registriert: 26.05.2006 13:21
Wohnort: Berlin
Kontaktdaten:

Beitrag von Andi1111 »

noch mal danke :)
das round() funktioniert jetzt wie es soll, und ob ich das andere richtig gemacht habe sehe ich am nächsten 1. :D
Antworten

Zurück zu „Coding & Technik“