Andere Tabelle miteinbeziehen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anfrage
anzahl
ausgeben
auto
brauche
code
fahrzeugtyp
glauben
gruppierung
marktwert
moped
problem
ressource
tabelle
type
umstand
url
verschiedene tabellen
versuchen
wahren situation
-
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. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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. -
travianinc schrieb:
Ich verwende auch bereits Anfragen auf verschiedene Tabellen, nur das Summieren habe ich bisher nie gebraucht.
Das ist jetzt nicht wirklich bös gemeint, aber Anfragen auf verschiedene Tabellen ist alles andere als unüblich...
travianinc schrieb:
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.
Für dein Testbeispiel benötigst du JOIN, GROUP BY und sum(). -
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. -
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.
-
deddyh schrieb:
Ja, weil alles Andere unlogisch wäre und es deswegen zu unbrauchbaren Ausgaben kommt.
Ist es nicht so, dass bei Aggregatfunktionen mit Gruppierung alle Nicht-Aggregatfelder in die Gruppierung einfließen müssen?
Aktuell mache ich es so:
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.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
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 -
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 -
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.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage