Wer kann helfen? Mit Bezahlung

Hi raiguen,

also sicherlich wird diese von dir genannte Variante nen ordentlichen Performance Schub bringen, da nicht so viele Joins nötig sind. Die Variante aus Post #5 hat damals nicht funktioniert, ich weiß auch nicht wieso.
Ich werde morgen mal deine Variante testen, danke schon mal an dieser Stelle.

Gruß
 
SELECT f.name_firma, f.adresse_firma
, COUNT(DISTINCT(a.id_auto_preis)) AS preisanz
, COUNT(DISTINCT(a.id_auto)) AS autoanz
, MAX(a.color='n') AS navy
, MAX(a.color='b') AS black
, MAX(a.color='r') AS red
, MAX(a.color='s') AS silver

FROM autos a
JOIN firma f ON f.id_firma=a.id_firma
WHERE f.id_firma=117
Group BY f.id_firma

Der Code hat wunderbar funktioniert, aber ich bekomme die Firmen nicht angezeigt, zu denen in der Tabelle Autos keine Einträge vorhanden sind. Sprich in Tabelle Firma ist ein Eintrag mit Firma XY zu dem keine Entsprechung in der Tabelle Autos vorliegt. Bei der anderen Variante werden mir alle angezeigt, warum hier nicht?

Gruß

EDIT: Muss eigentlich bei der Tabelle Autos kein WHERE Befehl stehen? Also das WHERE wäre zum Beispiel "Land = Japan". Müssten dann nicht sowohl die Tabelle firma als auch autos den WHERE-Befehl haben?
 
Zuletzt bearbeitet:
bekomme die Firmen nicht angezeigt, zu denen in der Tabelle Autos keine Einträge vorhanden sind
Ist ja auch insofern richtig, da durch die Abfragebedingung bzw -verknüpfung
Code:
JOIN firma f ON f.id_firma=a.id_firma
auch NUR die Autos herausgesucht/gefunden werden, die einen entsprechenden Firmeneintrag (id_firma) haben.
Wozu Firmen anzeigen, die KEINE Autos haben?
Code:
WHERE f.id_firma=117
sucht in diesem Beispiel ja auch nur die Autos der bestimmten Firma heraus ;)

Muss eigentlich bei der Tabelle Autos kein WHERE Befehl stehen? Also das WHERE wäre zum Beispiel "Land = Japan".
War zunächst ja nicht die 'Anforderung' deines Eingangsproblems ;)
Aber sicherlich macht es Sinn, dier Autos auch nach Hersteller oder Land oder... zu filtern.
Müssten dann nicht sowohl die Tabelle firma als auch autos den WHERE-Befehl haben?
Jain - kommt darauf an, nach WAS du suchen/filtern möchtest -> NUR nach Autos mit bestimmten Kriterien (Hersteller, Land,..) -> dann
Code:
FROM autos a
JOIN firma f ON f.id_firma=a.id_firma
WHERE a.Hersteller='Subaru'
Group BY f.id_firma
ODER nur nach Firma ->
Code:
FROM autos a
JOIN firma f ON f.id_firma=a.id_firma
WHERE f.id_firma=117
Group BY f.id_firma

Kombinationen sind natürlich auch möglich...
 
Danke für die schnelle Antwort.

also zu den zwei Tabellen, in einer stehen alle Firmen und in der anderen alle gelisteten Verkäufe. Ich muss ja auch sehen können, zu welchen Firmen aktuell noch keine Verkäufe gelistet sind. Also da, wo die Counts auf 0 stehen.

Das WHERE an sich, verstehe ich. Ich dachte nur, dass bei der aktuellen Abfrage ALLE Einträge in Autos zusammen gefasst werden (auch die, wo id_firma != 117) und dann erst mit firma verbunden wird, wo die id gleich ist und die restlichen ROWS fallen einfach weg. Das Problem dabei ist, dass die Tabelle Autos mehrere Millionen Einträge hat und wenn ich mit meiner Annahme richtig liege, kann er ja alle Einträge, wo das WHERE nicht zutrifft einfach überpsringen.

Aktuell dauert diese Abfrage 30 Sekunden auf einem sehr guten Root-Server.
 
also zu den zwei Tabellen, in einer stehen alle Firmen und in der anderen alle gelisteten Verkäufe..
Hab ich mir in sofern schon gedacht...

Ich muss ja auch sehen können, zu welchen Firmen aktuell noch keine Verkäufe gelistet sind. Also da, wo die Counts auf 0 stehen.
Okay, dann bauen wir die Abfrage ein wenig um:
Code:
SELECT f.name_firma, f.adresse_firma
, COUNT(DISTINCT(a.id_auto_preis)) AS preisanz
, COUNT(DISTINCT(a.id_auto)) AS autoanz
, MAX(a.color='n') AS navy
, MAX(a.color='b') AS black
, MAX(a.color='r') AS red
, MAX(a.color='s') AS silver
FROM autos a
RIGHT OUTER JOIN firma f ON a.id_firma=f.id_firma
GROUP BY a.id_firma

andere Variante:
Code:
SELECT f.name_firma AS fname, f.adresse_firma AS fadresse
, COUNT(DISTINCT(a.id_auto_preis)) AS preisanz
, COUNT(DISTINCT(a.id_auto)) AS autoanz
, MAX(a.color='n') AS navy
, MAX(a.color='b') AS black
, MAX(a.color='r') AS red
, MAX(a.color='s') AS silver
FROM firma f
LEFT OUTER JOIN autos a ON a.id_firma=f.id_firma
GROUP BY fname

bei der aktuellen Abfrage ALLE Einträge in Autos zusammen gefasst
Wenn die Gruppierung auf Firma nicht vorhanden ist. Bei Gruppierung auf Firma werden die Einträge PRO Firma angezeigt...

wo das WHERE nicht zutrifft einfach überpsringen
Intern schmeisst der DB-Server alle nicht passenden Datensätze in seinen 'Papierkorb', so dass nur die relevanten Daten angezeigt werden, die den Bedingungen entsprechen ;)
 
WOW danke. Der ist jetzt unglaublich schnell^^
Echt genial. Danke******!
Eine Frage hätt ich noch:
Wenn ich da jetzt noch WHERE f.id = $id eingebe, läuft er die f-Tabelle ja nur bei den Einträgen durch. Die f-Tabelle ist eh klein, die a-Tabelle hat mehrere Millionen Einträge. Kann man da irgendwie zwei Where Bedingungen machen. Quasi WHERE a.id = $id****
 
Wenn ich da jetzt noch WHERE f.id = $id eingebe, läuft er die f-Tabelle ja nur bei den Einträgen durch.
Ist doch klar: wenn du nur eine die AutoVerkäufe (so interpertiere ich ja nur bei den Einträgen) einer bestimmten Firma haben willst dann werden alle anderen Firmen selbstredend ignoriert ;)

Die f-Tabelle ist eh klein,
Gegenüber den Autos sicherlich ;)
die a-Tabelle hat mehrere Millionen Einträge.
Macht nix, ein DB-Server kommt damit gut zurecht.
Kann man da irgendwie zwei Where Bedingungen machen. Quasi WHERE a.id = $id****
Warum? Die Einschränkung hast du ja bereits auf die Firmen-ID, so dass aus den Millionen Autos halt nur diejenigen herausgesucht werden, die der gleichen Firmenid in der WHERE-Bedingung entsprechen (Verbindung über die JOIN-Klausel).
Eine zusätzliche Bedingung bei der Tabelle Autos auf firmenid ist nicht notwendig - es sei denn, es soll nach bestimmten Auto-Kriterien gefiltert werden; aber auch dann greift als 'Ober'-Filter die Firmen-ID (sofern expliziet nur nach bestimmten Firmen gefiltert werden soll);
z.B. nach einem bestimmten Herstellerland:
Code:
SELECT f.name_firma AS fname, f.adresse_firma AS fadresse
, COUNT(DISTINCT(a.id_auto_preis)) AS preisanz
, COUNT(DISTINCT(a.id_auto)) AS autoanz
, MAX(a.color='n') AS navy
, MAX(a.color='b') AS black
, MAX(a.color='r') AS red
, MAX(a.color='s') AS silver
FROM firma f
LEFT OUTER JOIN autos a ON a.id_firma=f.id_firma
WHERE a.land='frank'
Jetzt werden alle Autos aller Firmen angezeigt, die in Frankreich hergestellt wurden bzw franösischen Ursprungs sind. Firmen, die KEINE Verkäufe haben, werden natürlich NICHT angezeigt ;)

Code:
SELECT f.name_firma AS fname, f.adresse_firma AS fadresse
, COUNT(DISTINCT(a.id_auto_preis)) AS preisanz
, COUNT(DISTINCT(a.id_auto)) AS autoanz
, MAX(a.color='n') AS navy
, MAX(a.color='b') AS black
, MAX(a.color='r') AS red
, MAX(a.color='s') AS silver
FROM firma f
LEFT OUTER JOIN autos a ON a.id_firma=f.id_firma
WHERE f.id_firma=118
AND a.land='franz'
Dürfte klar sein ;) -> alle franz. Autos der Firma 118.
Jetzt alle Klarheiten beseitigt? Wenn nicht, dann fragen (ggf über PN).
 
Zurück