MySQL Problemchen Join und Union

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • MySQL Problemchen Join und Union

    Hi Forum.

    Erstmal zu meinem Problem.

    Ich habe hier 3 tabellen

    1.
    user:
    id | usernummer|name|bla|ort_id

    2.
    ort:
    id | ortname

    3.
    Autos:
    id | name | user_id

    Ein user kann mehrere Autos haben. Also in autos können 3 karren mit der Kunden id eines Kunden stehen.

    Ich möchte nun eine abfrage so gestalen:

    Ich möchte nur eine Zeile als ausgabe!

    Es soll ausgegeben werden:

    Kundennummer, Ort, autos

    Über einen Join hab ich es so versucht:

    Quellcode

    1. SELECT
    2. user.kundennummer, user.name, ort.name, autos.name
    3. FROM
    4. ((
    5. user
    6. INNER JOIN ort ON user.ort_id = ort.id)
    7. INNER JOIN autos ON autos.user_id)
    8. WHERE
    9. user.usernummer like = eingabesuchwertdings


    Mein ergebnis sieht dann Folgendermaßen aus:

    usernummer | name | ort.name | auto.name

    123456789 | ich | Karlsruhe | Opel
    123456789 | ich | Karlsruhe | VW
    123456789 | ich | Karlsruhe | Jaguar

    Das ergebniss sollte aber wenn möglich so aussehen

    usernummer | name | ort.name | auto.name1 | auto.name2 | auto.name 3

    123456789 | ich | Karlsruhe | Opel | VW | Jaguar

    Um das zu lösen habe ich mich an einem UNION versucht, was allerdings nicht geklappt hat (glaube weil beide selects eines unions die selbe anzahl an ergebnissen enthalen muss)
    Der Query sah so aus:

    Quellcode

    1. (
    2. SELECT user.usernummer, user.name, ort.name, auto.name
    3. FROM
    4. ((
    5. user
    6. INNER JOIN ort ON user.ort_id = ort.id)
    7. INNER JOIN autos ON autos.user_id = user.id)
    8. WHERE usernummer like '%blabla%'
    9. )
    10. UNION
    11. (
    12. SELECT
    13. auto.name
    14. FROM
    15. autos
    16. INNER JOIN user ON auto.user_id = user.id
    17. WHERE usernummer like '%blabla%'
    18. )
    Alles anzeigen


    Ich hoffe ihr versteht was ich meine. Ich möchte das die Userdaten und alle zugehörigen Autos (verknüpfung über autos.user_id) in einem ergebnis zurückgeliefert werden, sprich dummy spalten angelegt werden sollen in der dann alle autos stehen.
    In diesem schema eben:

    usernummer | name | ort.name | auto.name1 | auto.name2 | auto.name 3

    123456789 | ich | Karlsruhe | Opel | VW | Jaguar

    kann mir da einer nen tip geben?

    Danke schonmal

    grüße
    ----[Blockierte Grafik: http://www.smilie-harvester.de/smilies/Alltag/putzen.gif] Nein ich bin nicht die Signatur, ich Putz hier nur ---
  • Was du suchst ist eine Pivot Tabell, welche es meines Wissens in MySQL noch nicht gibt.

    Wenn du PHP zu Hilfe nimms, kannst du User und Ort Joinen und dann gesondert die Tabelle Autos auslesen und mit z.B php zusammenbasteln.

    Ansonsten kannst du das Pivot Verhalten auch simulieren.
    AdoDB hat es z.B integriert.
    Wenn es nur für einen Query ist, dann kannst du versuchen dir den SQL Statement selber zusammenzubasteln.
  • Pivot Tabelle nennt sich das also, wusste nicht nach welchem suchbegriff ich googlen muss :)

    AdoDb ist leider nicht möglich da ich keine zusätzlichen libarys installieren kann/möchte/darf :)

    da bleibt mir nur der "umständliche" weg mit das ganze rumzubasteln, dachte halt es gibt evtl eine schöne version, die mir das gewünschte ergebnis schon mit einer abfrage liefert
    ----[Blockierte Grafik: http://www.smilie-harvester.de/smilies/Alltag/putzen.gif] Nein ich bin nicht die Signatur, ich Putz hier nur ---
  • Alternativ zu Pivot Tabellen, kannst du auch alles in eine Spalte packen. Und mit einem individuellen Seperator wieder zerlegen
    Siehe dazu: dev.mysql.com/doc/refman/5.1/de/group-by-functions.html

    Quellcode

    1. SELECT student_name,
    2. -> GROUP_CONCAT(DISTINCT test_score
    3. -> ORDER BY test_score DESC SEPARATOR '@@') AS pseudopivot
    4. -> FROM student
    5. -> GROUP BY student_name;


    Quellcode

    1. $autos = explode('@@', $row['pseudopivot']);


    Beachte, dass die Spalte max 1024 Byte groß werden kann. Danach wird abgeschnitten.
  • Hej D0nut du bist ein Gott!

    Das klappt wunderbar vielen vielen dank :)

    Eine theoretische Frage habe ich da noch...

    Habe noch von der Ausbildung im Hinterkopf, das nen Ascii zeichen 2 byte benötigt bei utf-8 codierung.. Stimmt das so in etwa ? (ist nur interessehalber, die "group_concat" spalte wird nie größer als 50 zeichen.

    grüße
    ----[Blockierte Grafik: http://www.smilie-harvester.de/smilies/Alltag/putzen.gif] Nein ich bin nicht die Signatur, ich Putz hier nur ---