tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
28
ZUGRIFFE
1373
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Hallo,

    ich komm an einer Stelle nicht mehr weiter. Wer kann mir schnell helfen und für wieviel? Bitte per PN schreiben!

    Ich habe eine riesen Tabelle, die ich so auslesen muss, dass ich am Ende je $row nur eine id_firma habe, zu dieser die Anzahl der id_auto und der id_auto_preis. Zusätzlich muss ich wissen, welche Farben alle verfügbar sind. Das heißt, aus der Spalte color sollen später vier Spalten entstehen mit den jeweiligen farben als Boolean.

    Ich brauche hierzu das korrekten SQL-Statement:

    Tabelle

    `id_auto_preis`
    `id_auto`
    `id_firma`
    `year`
    `color` ('n','r','b','s')


    Output

    Je Zeile eine id_firma von Jahr XXXX, die Spalten sehen dann wie folgt aus:

    $row['id_firma']; <--- 'id_firma' um die es in dieser Zeile geht, darf immer nur einmal vorkommen
    $row['autos']; <--- Anzahl aller 'id_auto' für die jeweilige id_firma
    $row['preise']; <--- Anzahl aller 'id_auto_preis' für die jeweilige id_firma
    $row['navy']; <--- 1 wenn 'id_firma' mindestens ein mal 'color' = 'n' hat, ansonsten 0
    $row['red']; <--- 1 wenn 'id_firma' mindestens ein mal 'color' = 'r' hat, ansonsten 0
    $row['black']; <--- 1 wenn 'id_firma' mindestens ein mal 'color' = 'b' hat, ansonsten 0
    $row['silver']; <--- 1 wenn 'id_firma' mindestens ein mal 'color' = 's' hat, ansonsten 0


    Die Einträge könnten in der Tabelle so aussehen:

    1 2345 117 2008 n
    2 2345 117 2008 b
    3 2346 117 2008 b
    4 2346 117 2008 n
    5 2346 117 2008 n
    6 4488 118 2008 r
    7 4488 118 2008 r
    8 4489 118 2008 b
    9 4489 118 2008 b
    ...


    Gruß
     

  2. #2
    Avatar von vandamp
    vandamp vandamp ist offline Mitglied Gold
    Registriert seit
    Nov 2003
    Ort
    Wien
    Beiträge
    155
    Select
    If_Firma,
    Count(distinct id_Auto),
    count(Distinct id_Auto_Preis),
    Min(Case when color= 'r' them 'ja' Else 'nein' end) As Red,
    ... alle farben
    From table
    Group by id_Firma


    Sry für die schlechte Formatierung war grad zufällig am iPhone on und hab leider nicht die Tutorials App. Hoff dann wird es besser so ist es echt grauenhaft etwas zu schreiben

    So Long
    Vandamp
    Tommy57 bedankt sich. 
    m.f.g
    b. zimmel

  3. #3
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Super danke!

    Ich werde es gleich mal testen. Wenn es funktioniert, zahl ich natürlich gerne dafür
     

  4. #4
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Hmm schade. Das funktioniert leider auch nicht. Hab die Rechtschreibfehler auch soweit korrigiert. Nur leider führt er das Statement nicht aus ;(
     

  5. #5
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    SELECT
        id_firma,
        COUNT(DISTINCT id_auto) AS autos,
        COUNT(DISTINCT id_auto_preis) AS preise,
        MAX(color='n') AS navy,
        MAX(color='r') AS red,
        MAX(color='b') AS black,
        MAX(color='s') AS silver
    FROM
        mytable
    GROUP BY
        id_firma

    Ungetestet und mit 2 Promille - Prost
    Tommy57 bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  6. #6
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Danke für die Hilfe, aber irgendwie klappt es nicht. Vllt hängt das einfach mit der Größe der Tabelle zusammen. Die hat mehrere Millionen Einträge. Hab schon vieles probiert, aber bislang ohne Erfolg. Hab das Ganze in einem Try-Catch-Block und sobald ich das 'count' in das Statement rein setze springt er aus dem Ding raus und macht nix.
    Ich versteh das nicht.

    EDIT: Der springt NUR raus, wenn das count in Kombination mit anderen Befehlen steht. Das selbe gilt für die MAX Funktion. Ich weiß aber noch nicht warum.
    Geändert von Tommy57 (29.01.11 um 04:55 Uhr)
     

  7. #7
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Was gibt der catch-Block für eine Fehlermeldung?

    Ist Performance ein Thema oder ist das egal? Wen ja, setzte mehrere SQLs ab und hole die Infos einzeln
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    SELECT
        id_firma,
        COUNT(DISTINCT id_auto) AS autos
    FROM
        mytable
    GROUP BY
        id_firma;
     
    SELECT
        id_firma,
        MAX(color='n') AS navy
    FROM
        mytable
    GROUP BY
        id_firma;
     
    --etc
    Tommy57 bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  8. #8
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Hi,

    nein, Performance ist kein Thema. Das Resultat wird danach gecached. Kann man es denn irgendwie so schreiben, dass man mehrere Statements verschachtelt?

    EDIT: Also so, dass es im Endeffekt trotzdem nur ein Statement ist.

    Die Fehlermeldung kann ich aktuell nicht sagen, weil die Log-Datei merkwürdigerweise leer ist. So ein Mist...
    Geändert von Tommy57 (29.01.11 um 12:48 Uhr)
     

  9. #9
    Avatar von vandamp
    vandamp vandamp ist offline Mitglied Gold
    Registriert seit
    Nov 2003
    Ort
    Wien
    Beiträge
    155
    hmm kannst du auf mehrere arten lösen.
    Die Performance wir dadurch allerdings nicht besser, aber nen Versuch ist es wert.
    per union oder per join.

    JOIN variante
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    SELECT
    a.id_firma,
    a.autos,
    n.navy
    FROM( SELECT
            id_firma,
            COUNT(DISTINCT id_auto) AS autos
          FROM test
          GROUP BY
           id_firma 
         ) a
    JOIN(
        SELECT
            id_firma,
            MAX(color='n') AS navy
        FROM test
        GROUP BY
            id_firma
         ) n ON n.id_firma =  a.id_firma

    UNION

    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
    
    SELECT
    id_firma,
    SUM(autos) AS autos,
    SUM(navy) AS navy
    FROM 
    (
    SELECT
        id_firma,
        COUNT(DISTINCT id_auto) AS autos,
        0  AS navy
    FROM test
    GROUP BY
        id_firma 
     
    UNION
     
    SELECT
        id_firma,
        0 AS autos,
        MAX(color='n') AS navy
    FROM test
    GROUP BY
        id_firma
    ) n
    GROUP BY
    id_firma

    P.S.: braucht du es nur 1 mal oder musst du es regelmäßig ausführen?
    Ansonsten würd ich alle Werte einzeln ermitteln, wenn es funktioniert und dann im excel per sverweis verbinden.
    Geändert von vandamp (29.01.11 um 15:47 Uhr)
    Tommy57 bedankt sich. 
    m.f.g
    b. zimmel

  10. #10
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    WOooooOW, sieht gut aus. Also der lädt schon seit n paar Minuten, aber sieht richtig gut aus

    Hab jetzt mal die erste Variante genommen. Welche ist denn besser?

    Wie müsste ich das denn jetzt noch anpassen, damit ich die restlichen Farben noch kriege und count(DISTINCT id_auto_preis) und wo kommt da die WHERE Bedingung hin?
     

  11. #11
    Avatar von vandamp
    vandamp vandamp ist offline Mitglied Gold
    Registriert seit
    Nov 2003
    Ort
    Wien
    Beiträge
    155
    ja hmm welche Variante besser ist kann ich nicht sagen müsstest du mal auf den Explainplan schauen, aber denke die Join Version ist "besser".
    hab dir noch ein paar Farben hinzugefügt und alles auf id_firma = 117 beschränkt.

    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
    
    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
    Tommy57 bedankt sich. 
    m.f.g
    b. zimmel

  12. #12
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    1.000 Danke. Das hätte ich alleine nicht hingekriegt. Also er läuft gerade. Ich sag bescheid, wenn er fertig ist, kann jetzt bestimmt 10 Minuten dauern
     

  13. #13
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Es hat geklappt

    Das freut mich jetzt richtig. DANKE******

    Wie versprochen: Schick mir einfach per PN irgendwas(PayPAL, Bankverbindung, Anschrift), dann schick ich dir schon mal 50€. Hoffe, das ist nicht zu wenig.

    Ich bräuchte jetzt noch eine Sache

    Aktuell werden mir alle Firmen gelistet, die Verkäufe hatten. Ich habe hier noch eine Tabelle dort sind ALLE Firmen drin. Ich müsste nun nur noch alle fehlenden (hier auch wieder DISTINCT, weil die FirmenIDs in der Firmen-Tabelle häufiger vorkommen) hinzufügen. In der selbigen Tabelle stehen auch noch die ganzen Firmennamen, und wäre es dann noch möglich, die Namen zusätzlich Alphabetisch zu sortieren?
     

  14. #14
    Avatar von vandamp
    vandamp vandamp ist offline Mitglied Gold
    Registriert seit
    Nov 2003
    Ort
    Wien
    Beiträge
    155
    freut mich, dass es geklappt hat.

    zahlen musst du nichts, steht ja nicht in der Rubrik entgeltlich und das Motto eines jeden Forums ist User helfen Usern.
    Wenn es dir ein anliegen ist, spende es lieber tutorials.de ( falls überhaupt möglich habe eigentlich noch keinen Button gesehen) oder einer gemeinnützigen Organisation.

    nun noch die Lösung deines Problems.
    Wie auch oben habe ich in der where bedingung alles auf firma 117 eingeschränkt - musst du ggf. anpassen.
    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
    Geändert von vandamp (29.01.11 um 17:20 Uhr)
    Tommy57 bedankt sich. 
    m.f.g
    b. zimmel

  15. #15
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Ja, du hast sicherlich recht, dass dieses Forum dem Zweck dient zu helfen, aber das hier war ja keine Kleinigkeit. Mich hat das richtig lang aufgehalten und ich habe ja auch oben geschrieben, dass ich dafür auch zahlen möchte. Es liegt bei dir, aber mit dem neuen Code-Block würde ich dir schon 70 Euro überweisen, du hast dir ja auch die ganzen Mühe gemacht. Finde ich nur gerecht.
     

Ä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