tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
ERLEDIGT
JA
ANTWORTEN
28
ZUGRIFFE
1373
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    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.
     

  2. #17
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.366
    Blog-Einträge
    4
    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 erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  3. #18
    Avatar von vandamp
    vandamp vandamp ist offline Mitglied Gold
    Registriert seit
    Nov 2003
    Ort
    Wien
    Beiträge
    155
    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)
    Tommy57 bedankt sich. 
    m.f.g
    b. zimmel

  4. #19
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    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******
     

  5. #20
    raiguen raiguen ist offline Mitglied Silber
    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
    Code :
    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
    nicht funktionieren soll? Im Ansatz wurde es ja bereits im Post #5 vorgeschlagen

    @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...
    Tommy57 bedankt sich. 
    Es ist erstaunlich, was man alles findet, wenn man etwas sucht...

  6. #21
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    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ß
     

  7. #22
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Super, das Statement funktioniert und ist 3mal so schnell wie das vorherige. Danke, das ist echt klasse.
     

  8. #23
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    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?
    Geändert von Tommy57 (18.02.11 um 08:15 Uhr)
     

  9. #24
    raiguen raiguen ist offline Mitglied Silber
    Registriert seit
    Feb 2008
    Ort
    Salzhemmendorf(Nds)
    Beiträge
    51
    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 :
    1
    
    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 :
    1
    
    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 :
    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
    ODER nur nach 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...
    Tommy57 bedankt sich. 
    Es ist erstaunlich, was man alles findet, wenn man etwas sucht...

  10. #25
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    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.
     

  11. #26
    raiguen raiguen ist offline Mitglied Silber
    Registriert seit
    Feb 2008
    Ort
    Salzhemmendorf(Nds)
    Beiträge
    51
    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 :
    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

    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
    Tommy57 bedankt sich. 
    Es ist erstaunlich, was man alles findet, wenn man etwas sucht...

  12. #27
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    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****
     

  13. #28
    raiguen raiguen ist offline Mitglied Silber
    Registriert seit
    Feb 2008
    Ort
    Salzhemmendorf(Nds)
    Beiträge
    51
    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 :
    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'
    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 :
    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'
    Dürfte klar sein -> 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...

  14. #29
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Ahh okay danke, das versteh ich
     

Ähnliche Themen

  1. Wer kann mir helfen?
    Von MoJo48 im Forum Java Grundlagen
    Antworten: 11
    Letzter Beitrag: 23.11.09, 10:54
  2. Wer kann uns helfen ?
    Von Fluglehrer im Forum Flash Plattform
    Antworten: 0
    Letzter Beitrag: 07.04.08, 17:07
  3. Antworten: 14
    Letzter Beitrag: 09.03.07, 16:31
  4. Wer kann helfen?
    Von chrissbk im Forum PHP
    Antworten: 4
    Letzter Beitrag: 01.08.05, 21:23
  5. Wer kann helfen
    Von christiandickel im Forum PHP
    Antworten: 1
    Letzter Beitrag: 11.10.04, 22:01