-
Code sql:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
SELECT alle.id_firma, alle.name_firma, alle.adresse_firma, a.autos, p.preis, n.navy, r.red, b.black, s.silver FROM( SELECT DISTINCT id_firma, name_firma, adresse_firma FROM test2 WHERE id_firma = 117 ) alle LEFT JOIN( SELECT id_firma, COUNT(DISTINCT id_auto) AS autos FROM test WHERE id_firma = 117 GROUP BY id_firma ) a ON a.id_firma = alle.id_firma LEFT JOIN( SELECT id_firma, COUNT(DISTINCT id_auto_preis) AS preis FROM test WHERE id_firma = 117 GROUP BY id_firma )p ON p.id_firma = alle.id_firma LEFT JOIN( SELECT id_firma, MAX(color='n') AS navy FROM test WHERE id_firma = 117 GROUP BY id_firma ) n ON n.id_firma = alle.id_firma LEFT JOIN( SELECT id_firma, MAX(color='r') AS red FROM test WHERE id_firma = 117 GROUP BY id_firma ) r ON r.id_firma = alle.id_firma LEFT JOIN( SELECT id_firma, MAX(color='b') AS black FROM test WHERE id_firma = 117 GROUP BY id_firma ) b ON b.id_firma = alle.id_firma LEFT JOIN( SELECT id_firma, MAX(color='s') AS silver FROM test WHERE id_firma = 117 GROUP BY id_firma ) s ON s.id_firma = alle.id_firma ORDER BY alle.name_firma ASC
Hmm... da springt der irgendwie wieder raus. Kann es sein, dass da irgendwo ein Fehler ist, also ich habe nix gefunden.
-
29.01.11 17:38 #17
Nebenbei, unter Kontakt befindet sich ein Link zum Spenden, der auf diese Seite weiterleitet.
mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
sollte eigentlich keinen Fehler haben, aber schreiben wir es mal anders

mehrere Wege führen nach Rom.
Bzw. was meinst du mit "springt raus" gibt's eine Fehlermeldung? oder ist die Laufzeit zu lang? Was verwendest du überhaupt für eine Datenbank
?
Code sql:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
SELECT alle.id_firma, alle.name_firma, alle.adresse_firma, d.autos, d.preis, d.navy, d.red, d.black, d.silver FROM ( SELECT DISTINCT id_firma, name_firma, adresse_firma FROM test2 ORDER BY name_firma ASC ) alle LEFT JOIN ( SELECT a.id_firma, a.autos, p.preis, n.navy, r.red, b.black, s.silver FROM( SELECT id_firma, COUNT(DISTINCT id_auto) AS autos FROM test WHERE id_firma = 117 GROUP BY id_firma ) a JOIN( SELECT id_firma, COUNT(DISTINCT id_auto_preis) AS preis FROM test WHERE id_firma = 117 GROUP BY id_firma )p ON p.id_firma = a.id_firma LEFT JOIN( SELECT id_firma, MAX(color='n') AS navy FROM test WHERE id_firma = 117 GROUP BY id_firma ) n ON n.id_firma = a.id_firma LEFT JOIN( SELECT id_firma, MAX(color='r') AS red FROM test WHERE id_firma = 117 GROUP BY id_firma ) r ON r.id_firma = a.id_firma LEFT JOIN( SELECT id_firma, MAX(color='b') AS black FROM test WHERE id_firma = 117 GROUP BY id_firma ) b ON b.id_firma = a.id_firma LEFT JOIN( SELECT id_firma, MAX(color='s') AS silver FROM test WHERE id_firma = 117 GROUP BY id_firma ) s ON s.id_firma = a.id_firma ) d ON d.id_firma = alle.id_firma
Geändert von vandamp (29.01.11 um 17:55 Uhr)
m.f.g
b. zimmel
-
Super, beide funktionieren jetzt und ich glaube die zweite Variante ist auch noch um einiges schneller. Danke!
Also, wie gesagt, das Angebot steht noch: schick mir ne PN und ich überweis dir 70 Euro. Was du dann damit machst, ob du es spenden willst oder so, ist dir überlassen.
DANKE******
-
16.02.11 18:48 #20
- Registriert seit
- Feb 2008
- Ort
- Salzhemmendorf(Nds)
- Beiträge
- 51
Auch wenn das Thema als erledigt zu betrachten ist, so frage ich mich, warum das hier
nicht funktionieren soll? Im Ansatz wurde es ja bereits im Post #5 vorgeschlagenCode :1 2 3 4 5 6 7 8 9 10 11 12
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

@vandamp: in deinem zuletzt geposteten Statement werden ALLE Firmen angezeigt, allerdings dann mit 'NULL' in den Spalten, bis auf die Firma, deren ID expliziet in den JOIN-Bedingungen genannt wurde...
Wie gesagt, Thema ist ja durch; mich hat nur das umständliche geJOINe verwundert, was m.E. nicht sein müsste. Es sei denn: ich habe was entscheidendes übersehen...
Es ist erstaunlich, was man alles findet, wenn man etwas sucht...
-
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ß
-
Super, das Statement funktioniert und ist 3mal so schnell wie das vorherige. Danke, das ist echt klasse.
-
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?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
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?Geändert von Tommy57 (18.02.11 um 08:15 Uhr)
-
18.02.11 11:24 #24
- Registriert seit
- Feb 2008
- Ort
- Salzhemmendorf(Nds)
- Beiträge
- 51
Ist ja auch insofern richtig, da durch die Abfragebedingung bzw -verknüpfungbekomme die Firmen nicht angezeigt, zu denen in der Tabelle Autos keine Einträge vorhanden sind
auch NUR die Autos herausgesucht/gefunden werden, die einen entsprechenden Firmeneintrag (id_firma) haben.Code :1
JOIN firma f ON f.id_firma=a.id_firma
Wozu Firmen anzeigen, die KEINE Autos haben?
sucht in diesem Beispiel ja auch nur die Autos der bestimmten Firma herausCode :1
WHERE f.id_firma=117
War zunächst ja nicht die 'Anforderung' deines EingangsproblemsMuss eigentlich bei der Tabelle Autos kein WHERE Befehl stehen? Also das WHERE wäre zum Beispiel "Land = Japan".
Aber sicherlich macht es Sinn, dier Autos auch nach Hersteller oder Land oder... zu filtern.
Jain - kommt darauf an, nach WAS du suchen/filtern möchtest -> NUR nach Autos mit bestimmten Kriterien (Hersteller, Land,..) -> dannMüssten dann nicht sowohl die Tabelle firma als auch autos den WHERE-Befehl haben?ODER nur nach Firma ->Code :1 2 3 4
FROM autos a JOIN firma f ON f.id_firma=a.id_firma WHERE a.Hersteller='Subaru' Group BY f.id_firma
Code :1 2 3 4
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...Es ist erstaunlich, was man alles findet, wenn man etwas sucht...
-
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.
-
18.02.11 16:27 #26
- Registriert seit
- Feb 2008
- Ort
- Salzhemmendorf(Nds)
- Beiträge
- 51
Hab ich mir in sofern schon gedacht...also zu den zwei Tabellen, in einer stehen alle Firmen und in der anderen alle gelisteten Verkäufe..
Okay, dann bauen wir die Abfrage ein wenig um: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.
Code :1 2 3 4 5 6 7 8 9 10
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 :1 2 3 4 5 6 7 8 9 10
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
Wenn die Gruppierung auf Firma nicht vorhanden ist. Bei Gruppierung auf Firma werden die Einträge PRO Firma angezeigt...bei der aktuellen Abfrage ALLE Einträge in Autos zusammen gefasst
Intern schmeisst der DB-Server alle nicht passenden Datensätze in seinen 'Papierkorb', so dass nur die relevanten Daten angezeigt werden, die den Bedingungen entsprechenwo das WHERE nicht zutrifft einfach überpsringen
Es ist erstaunlich, was man alles findet, wenn man etwas sucht...
-
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****
-
18.02.11 23:40 #28
- Registriert seit
- Feb 2008
- Ort
- Salzhemmendorf(Nds)
- Beiträge
- 51
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 ignoriertWenn ich da jetzt noch WHERE f.id = $id eingebe, läuft er die f-Tabelle ja nur bei den Einträgen durch.
Gegenüber den Autos sicherlichDie f-Tabelle ist eh klein,
Macht nix, ein DB-Server kommt damit gut zurecht.die a-Tabelle hat mehrere Millionen Einträge.
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).Kann man da irgendwie zwei Where Bedingungen machen. Quasi WHERE a.id = $id****
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:
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 angezeigtCode :1 2 3 4 5 6 7 8 9 10
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'

Dürfte klar seinCode :1 2 3 4 5 6 7 8 9 10 11
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'
-> alle franz. Autos der Firma 118.
Jetzt alle Klarheiten beseitigt? Wenn nicht, dann fragen (ggf über PN).Es ist erstaunlich, was man alles findet, wenn man etwas sucht...
-
Ahh okay danke, das versteh ich
Ähnliche Themen
-
Wer kann mir helfen?
Von MoJo48 im Forum Java GrundlagenAntworten: 11Letzter Beitrag: 23.11.09, 10:54 -
Wer kann uns helfen ?
Von Fluglehrer im Forum Flash PlattformAntworten: 0Letzter Beitrag: 07.04.08, 17:07 -
Wer kann helfen? Wie kann ich im Photoshop mein Logo mit Gras "überziehen"?
Von LA-Chiller im Forum PhotoshopAntworten: 14Letzter Beitrag: 09.03.07, 16:31 -
Wer kann helfen?
Von chrissbk im Forum PHPAntworten: 4Letzter Beitrag: 01.08.05, 21:23 -
Wer kann helfen
Von christiandickel im Forum PHPAntworten: 1Letzter Beitrag: 11.10.04, 22:01



10Danke

Zitieren

Login





