php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 07-06-2010, 22:35
INC.
 Registrierter Benutzer
Links : Onlinestatus : INC. ist offline
Registriert seit: Nov 2005
Beiträge: 106
INC. ist zur Zeit noch ein unbeschriebenes Blatt
Standard [MySQL] Formulierung von Query gesucht

Hallo erstmal!

ich versuche gerade bestimmte Daten so auszulesen, dass ich weder unzählige Queries brauche, noch alles mögliche aus der DB hole und erst in PHP filtere. Allerdings stehe ich gerade ziemlich auf dem Schlauch.

Es geht um ein Fussball-Tippspiel.

Die relevaten Tabellen:

1. "users": Hier sind die Felder 'id' und 'points' relevant. points stellt die Anzahl der Punkte dar, die der user insgesamt gewonnen hat bisher.

2. "matches": Hier ist die id relevant und der status, welcher für folgendes vorhaben auf "finished" stehen muss. Die Tabelle ansich repräsentiert die eínzelnen Spiele der Mannschaften.

3. "wetten": hier sind user-id und match-id relevant, wobei die user-id den ids aus 1. entspricht und match-id den ids aus 2. Zusätzlich gibt es noch ein Feld credits. Dieses beschreibt, wieviel punkte der user in diesem speziellen match bekommen hat. Im Gegensatz zu den points aus 1. sind diese Werte nicht numerisch, sondern Konstanten wie "win", "loss".


Was getan werden soll:

Von den besten 10 Usern (= den 10 mit den meisten Punkten) soll ermittelt werden, wie oft sie in den letzten 10 matches (= neusten 10 matches mit status = finished) die Konstanten win oder loss erhalten haben, genau gesagt für jeden einzelnen.


Da das Skriptergebnis gecacht wird, ist die Performance ziemlich zweitrangig, aber was mir bisher so einfiel ist trotz dessen unter aller sau.

Ich hätte es simpel gehalten und 3 Queries gebaut. Der erste holt die besten 10 User (Select id from users order by points desc limit 0,10), der zweite holt die letzten 10 matches (select id form matches where status = closed order by date desc limit 0,10)... tjo und da ich die Daten jetzt in PHP habe, wäre der dritte ja kein Problem mehr... dachte ich. Das wäre dann für jeden user alle matches durchgehen und die credits fetchen -> 2 verschachtelte foreach-Schleifen mit einem Query in der Mitte.. (select credits from wetten where userid = ? and matchid = ?). Rein logisch betrachtet sicherlich richtig, aber da wäre ich ja bei 100 Queries.

Wie würdet ihr das lösen?

Danke!
Mit Zitat antworten
  #2 (permalink)  
Alt 07-06-2010, 22:49
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

versuch's mal mit unkorrelierten Unterabfragen:

Code:
select *
from wetten
join (select * from users ... limit 10) as user_top10
    on ...
join (select * from matches ... limit 10) as match_top10
    on ...
...
Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #3 (permalink)  
Alt 07-06-2010, 22:56
INC.
 Registrierter Benutzer
Links : Onlinestatus : INC. ist offline
Registriert seit: Nov 2005
Beiträge: 106
INC. ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Vielen Dank schonmal. Sowas hatte ich mir auch schon überlegt, allerdings scheint es so zu sein, dass der LIMIT-Befehl in Subqueries nicht erlaubt ist - oder hat sich das mittlerweile geändert? (Google mit "subquery limit" ist voll davon). Das hat mich bisher davon abgehalten.
Mit Zitat antworten
  #4 (permalink)  
Alt 07-06-2010, 23:08
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von INC. Beitrag anzeigen
der LIMIT-Befehl in Subqueries nicht erlaubt ist
Das stimmt so nicht und wenn, dann nur für korrelierte Unterabfragen, aber die meide ich sowieso wo immer es geht.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #5 (permalink)  
Alt 11-06-2010, 17:06
INC.
 Registrierter Benutzer
Links : Onlinestatus : INC. ist offline
Registriert seit: Nov 2005
Beiträge: 106
INC. ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hatte erst heute Zeit mich wieder damit zu beschäftigen, nochmal danke.

Also ich habe noch nicht ganz verstanden, wie das ganze verknüpft werden muss. Was zurückgegeben soll (pro Fetch-"Durchlauf" bzw. Zeile) ist die id aus der Tabelle users und daneben noch den credit.

Das heißt man müsste wohl direkt das select anpassen... muss ich außerdem in den subquerys alles holen, wenn ich nur die id brauche?

Eventuell kannst du mir hier etwas auf die Sprünge helfen, mein jämmerlicher Versuch:

Code:
select w.credit, user_top10.id
from wetten w
join (select * from users order by points desc limit 10) as user_top10
    on //..?
join (select * from matches where status = 'closed' order by date desc limit 10) as match_top10
    on //...?
Mit Zitat antworten
  #6 (permalink)  
Alt 11-06-2010, 17:31
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hier kommen jetzt deine Fremdschlüsselspalten zum Einsatz, aber ich weiß nicht, wie die heißen, daher ist das nur geraten:

Code:
select w.credit, user_top10.id
from wetten w
join (select * from users order by points desc limit 10) as user_top10
    on user_top10.id = w.user_id
join (select * from matches where status = 'closed' order by date desc limit 10) as match_top10
    on match_top10.id = w.match_id;
Weitere Infos gibt's im MySQL Manual unter „JOIN Syntax“.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MySQL Query für Abfrage gesucht Breezzer Projekthilfe 6 28-07-2006 10:53
[MySQL 4.0] Query in Query Someday SQL / Datenbanken 3 28-05-2006 14:18
SQL Query gesucht sEeb SQL / Datenbanken 2 06-03-2006 15:44
beste mysql_error formulierung akrab PHP Developer Forum 15 06-07-2005 14:59
access query ==> mysql query oli007 SQL / Datenbanken 24 06-10-2003 21:40

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:03 Uhr.