kostenloser Webspace werbefrei: lima-city


Andere Tabelle miteinbeziehen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    das-koenigreich

    das-koenigreich hat kostenlosen Webspace.

    Hi, ich habe ein kleines Problem mit MySQL. Damit ich die wahre Situation nicht ausführlich schildern muss, versuche ich, das Ganze auf das Wesentliche herunter zu kürzen.

    Gehen wir von einer Tabelle 'user' aus. Diese hat beispielsweise die Spalten ID, username, password, usw. ... Die Spalte, die ich dort nicht haben möchte, ist, wie viel die virtuellen Autos (habe ich mir ausgedacht, da man es sich so hoffentlich gut vorstellen kann) der jeweiligen User zusammen kosten.

    Die Autos der User sind in der Tabelle 'cars' gespeichert. Diese hat die wesentlichen Spalten ID, marketValue und ownerId.

    Nun will ich beispielsweise die User alphabetisch geordnet ausgeben und dabei auch ausgeben, welchen Marktwert ihre Autos (nur den Gesamtwert aller Autos des jeweiligen Users) gerade haben. Ich könnte natürlich die Tabelle 'user' alphabetisch geordnet durchgehen und dann mit lauter einzelnen weiteren Querys für jeden User schauen, wie viel seine Autos gerade wert sind. Das wären aber viel zu viele Datenbankabfragen und genau deswegen muss unbedingt eine Alternative her.

    Ich verwende die jeweils neuesten Versionen von PHP und MySQL und nutze PDO.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Du solltest dich vielleicht wenigstens in Grundlagen einarbeiten, bevor du anfängst mit mysql. Das ist jetzt nicht wirklich bös gemeint, aber Anfragen auf verschiedene Tabellen ist alles andere als unüblich...

    Für dein Testbeispiel benötigst du JOIN, GROUP BY und sum().

    Die Dokumentation findet man unter http://dev.mysql.com/doc/refman/5.6/en/.
    Wenns dann noch Probleme gibt steh ich gerne weiter zur Verfügung.
  4. Autor dieses Themas

    das-koenigreich

    das-koenigreich hat kostenlosen Webspace.

    travianinc schrieb:
    Das ist jetzt nicht wirklich bös gemeint, aber Anfragen auf verschiedene Tabellen ist alles andere als unüblich...
    Ich verwende auch bereits Anfragen auf verschiedene Tabellen, nur das Summieren habe ich bisher nie gebraucht.


    travianinc schrieb:
    Für dein Testbeispiel benötigst du JOIN, GROUP BY und sum().
    Nö, JOIN und GROUP BY brauche ich gerade überhaupt nicht, mir hat nur SUM() gefehlt. Mit Sub-Querys funktioniert meine Anwendung nun, ich werde aber noch versuchen, die Sub-Querys raus zu bekommen. Wahrscheinlich werde ich dann oben Genanntes benötigen.
  5. SELECT username, sum(marketvalue)
    FROM user JOIN cars ON user.id = cars.ownerid
    GROUP BY ownerid;

    Sollte genau das liefern was du brauchst. Da bin ich mir nicht sicher ob Group By probleme mit dem username macht.

    Ansonsten:

    SELECT username, totalval
    FROM user JOIN (SELECT ownerid, sum(marketvalue) AS totalval FROM cars GROUP BY ownerid) AS a ON user.id=a.ownerid

    Hier sind JOIN, sum() und GROUP BY drinne ohne die exzessive Benutzung von sub querys.
    Ich glaube die verschlechtern die Performance der Anfrage nämlich erheblich.
  6. Ist es nicht so, dass bei Aggregatfunktionen mit Gruppierung alle Nicht-Aggregatfelder in die Gruppierung einfließen müssen? Gut, IIRC handhabt MySQL das etwas anders, aber man sollte den Umstand zumindest im Hinterkopf behalten.
  7. Autor dieses Themas

    das-koenigreich

    das-koenigreich hat kostenlosen Webspace.

    deddyh schrieb:
    Ist es nicht so, dass bei Aggregatfunktionen mit Gruppierung alle Nicht-Aggregatfelder in die Gruppierung einfließen müssen?
    Ja, weil alles Andere unlogisch wäre und es deswegen zu unbrauchbaren Ausgaben kommt.

    Aktuell mache ich es so:
    SELECT		user.ID as ID,
    		user.username  as username,
    		(SELECT		COUNT(*)
    		 FROM		vehicles vehiclesType1
    		 WHERE		vehiclesType1.ownerId = user.ID AND vehiclesType1.type = 1) as cars,
    		(SELECT		COUNT(*)
    		 FROM		vehicles vehiclesType2
    		 WHERE		vehiclesType2.ownerId = user.ID AND vehiclesType2.type = 2) as motorcycles
    FROM		user
    Ich habe gerade bemerkt, dass meine Vereinfachung leider zu sehr vereinfacht. Ich brauche nämlich mehrere Nicht-Felder, weswegen ich die Tabelle 'cars' nun 'vehicles' genannt habe und von dort sowohl die Anzahl der Autos, als auch die Anzahl der Motorräder auslese. In der wahren Situation muss ich jetzt doch die Datensätze abzählen lassen und nicht summieren lassen, da das wiederum an anderer Stelle Ressourcen spart. Autos entsprechen dem Fahrzeugtyp 1 und Motorräder dem Fahrzeugtyp 2.

    Geht das auch ohne Sub-Querys? Ich glaube nämlich, dass das sehr ressourcenlastig wird, wenn es erst einmal richtig viele Datensätze in der Usertabelle (in Wahrheit ist das keine Usertabelle, jeder User wird in dieser Tabelle mehrere Datensätze haben) und noch 15-20 mal mehr in der Fahrzeug-Tabelle geben wird.

    Beitrag zuletzt geändert: 23.8.2011 17:42:57 von das-koenigreich
  8. Mhm, ich hätte das so abgefragt:
    SELECT
        vehicles.ownerid AS ID,
        user.username AS username,
        CASE WHEN type=1 THEN 'Auto' ELSE 'Moped' END AS type,
        COUNT(type) AS count
    FROM vehicles
    JOIN user ON cars.ownerid=user.id
    GROUP BY vehicles.ownerid, user.username, vehicles.type;


    Mit freundlichen Grüßen
  9. Autor dieses Themas

    das-koenigreich

    das-koenigreich hat kostenlosen Webspace.

    Das geht leider nicht, da ein User nicht nur 2 Autos oder 5 Motorräder haben kann. Er kann auch von beidem welche haben und noch Fahrräder und Wohnwägen dazu.
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!