Spalte mehrdeutig

  • PHP

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von Link275.

    Spalte mehrdeutig

    Hallo Community,
    Ich stehe vor einem Problem.
    Ich lese mit meinem Query mehrere Tabellen auf einen schlag aus. Alle Tabellen, habe die Spalte "Kunde". Wenn ich das Script nun auf meinem Server Ausführe, bekomme ich gesagt, das die Spalte "Kunde" mehrdeutig ist.
    Gibt es eine möglichkeit sowas zu beheben oder muss ich das ganze in eine Tabelle feuern (was ich ehrlich gesagt umgehen will) ??

    Gibt's bei SQL nicht sowas wie das hier?:
    SELECT Tabelle1.Kunde, Tabelle2.Kunde, Tabelle3.Kunde FROM Tabelle1 JOIN Tabelle2 ON ...
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Im Prinzip richtig, allerdings sind Tabellennamen oft länger und damit würde der gesamte Query unübersichtlich, deswegen kann man den Tabellen einen Alias geben

    SQL-Abfrage

    1. SELECT t1.Kunde, t2.Kunde, t3.Kunde FROM `Tabelle1` AS `t1` LEFT JOIN `Tabelle2` AS `t2` LEFT JOIN `Tabelle3` AS `t3`


    Allerdings befürchte ich so wie das schreibst hast du ein völlig falschen Ansatz was Tabellen Struktur angeht, wieso haben mehrere Tabellen die Spalte Kunde? Wenn es eine Verknüpfugn gibt, machs mit einer KundenID und die musst in der SELECT-Klausel ja nicht mehr als 1 Mal angeben, denn die Kunden ID wird ja wohl die selbe sein und sich aus den verschiedenen Tabellen die Infos über den Kunden zusammenholen.
    Also das mit den Aliasen ist mir neuland.
    Aber wenn ich es richtig verstanden habe, müsste der komplette Query dann so aussehen:

    SQL-Abfrage

    1. SELECT t1.Kunde, t2.Kunde, t3.Kunde FROM `Bearbeiter` AS `t1` LEFT JOIN `paket` AS `t2` LEFT JOIN `software` AS `t3`WHERE `Kunde` =


    Oder habe ich dort was falsch aufgenommen ??
    Das mit der Tabellen Struktur hat ein freund von mir so mir geschrieben. Persönlich hätte das ganze über nur eine Tabelle gemacht

    Aber was hat das für ein Sinn? Du übergibst in die Where-Klausel wohl ein Kundennamen und ließt auch die Kundennamen wieder aus?? Was hat man davon??

    Wenn ich an den SQL Query WHERE `username` = 'Dodo' übergebe, werden die 3 Spalten natürlich NUR "Dodo" enthalten O.o

    Das man sowas trennt kann schon sein, aber dann Arbeit man mit IDs und Verknüpfungen, momentan ließt du nur 3 Tabellen aus die aber so keinen bezug zueinander haben.

    Wenn du also Auslesne willst wleche Software der Kunde A hat, so hast z.B. 2 Tabellen

    Tabelle1: users
    userID | username

    Tabelle2: software
    softwareID | userID | softwareName

    Nun willst du alle Software haben die dem User Dodo z.B. gehören, dann sieht dein Query wie folgt aus

    SQL-Abfrage

    1. SELECT s.softwareName FROM `users` AS `u` LEFT JOIN `software` AS `s` ON s.userID = u.userID WHERE u.username = 'Dodo'


    Das heißt es wird nun in der Tabelle Users nach dem Usernamen "Dodo" geschaut, mit der LEFT JOIN Verknüpfung wird die Tabelle Software angefasst, vom aktuellen Datensat (Dodo) die UserID genommen und als Bedingung für diese Selektion genutzt, also "Gebe mir alle Software Datensätze wo die userID die userID vom User 'Dodo' sind.

    So macht man vernünftige Tabellen Strkuturen.
    Also sollte man am besten anstatt mit Namen mit ID's Arbeiten ??

    Also sollte man am besten anstatt mit Namen mit ID's Arbeiten ??


    Ja sollte man. Gut, du kannst auch die Namen-Spalte Unique oder Primary setzen aber ob das dann Sinn macht... Alternativ kannst du auch einen Unique Index über mehrere Spalten anlegen aber das is auch unsauber.
    Nimm also am besten IDs (vmtl. AI, und dann immer mindestens Unique, am besten Primary) und stell' Beziehungen über mehrere Tabellen via Fremdschlüssel her.


    Link :thumbup:
    Hello World

    Link275 schrieb:

    Beziehungen über mehrere Tabellen via Fremdschlüssel her.

    Das were dann die ID geschichte sprich die ID von der Tabelle "Kunden" steht hinter der Software von dem "Kunden" in der Tabelle Software. Oder hab ich da was verdreht

    Das were dann die ID geschichte sprich die ID von der Tabelle "Kunden" steht hinter der Software von dem "Kunden" in der Tabelle Software. Oder hab ich da was verdreht


    Wo die steht is ja scheißegal. Ich persönlich handhabe das bei mir meist so:

    Tabelle "Kunden"
    Spalte "ID"
    Spalte "Vorname"
    Spalte "Nachname"

    Tabelle "Software"
    Spalte "ID"
    Spalte "Software_Name"
    Spalte "Lizenzcode"
    Spalte "Kunden_ID"

    Beispiel:
    Tabelle Kunden:
    ID=38
    Vorname=Hans
    Nachname=Müller

    Tabelle Software:
    Software_Name=Microsoft Office
    Lizenzcode=123-456-789-012-345
    Kunden_ID=38

    Eine Software kann von mehreren Kunden genutzt werden -> mehrere Kunden können ein und dasselbe Software-Produkte im Einsatz haben.

    SQL-Abfrage

    1. SELECT `Software_Name` FROM `Software` WHERE `Kunden_ID` = '38'

    Zeige alle Software-Produkte die von Kunde "Hans Müller" verwendet werden.

    Es kommt drauf an. Du kannst Kunden haben die Software Nutzen, in dem Fall hast du in Tabelle Software eine Spalte "Kunden_ID" welche den Fremdschlüssel darstellt. Oder aber du hast Software, die von Kunden genutzt wird. In diesem Fall steht die Software mehr im Vordergrund, die Spalte "Kunden_ID" fällt weg. In der Tabelle "Kunden" hast du dann als Fremdschlüssel eine Spalte "Software_ID". Damit kannst du den Query dann entsprechend umkehren:

    SQL-Abfrage

    1. SELECT `Vorname`, `Nachname` FROM `Kunden` WHERE `Software_ID` = '12'

    zum Beispiel.
    Schau dir in dem Zusammenhang auf jeden Fall nochmal die Sache mit den Fremdschlüsseln an. Um deine Tabellen optimal zu erstellen solltest du auch die Normalformen einer Datenbank beachten, sehr wichtig!



    Link :thumbup:
    Hello World

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Link275“ ()

    Kunden_ID <--> ID von dem Kunden in der Tabelle Kunden richtig ??

    So ist es. Bei mir hat jede Tabelle immer sein eigenes "ID" Feld. Der Fremdschlüssel setzt sich dann immer aus dem Namen der Tabelle und "_ID" zusammen. Aber das kannst du dir zusammenbasteln wie's dir passt, ich finde es so halt übersichtlich.

    Link :thumbup:
    Hello World
    Und dann einfach mittels Left-Join die Tabellen durchlaufen und die Daten wie von Dodo erwähnt ausgeben stimmts ?

    Ich will Daten in einer HTML Tabelle ausgeben

    Ich Brauche aus der Tabelle Bearbeiter: Editor und Name_edit
    Aus der Tabelle: Software: hersteller,Version,Produktname
    Tabelle paket: Name und Status

    Das alles, will ich in einer HTML Tabelle ausgeben

    Ok. Und das brauchst du ganz ohne Bedingung(en)?

    SQL-Abfrage

    1. SELECT `Editor`, `Name_edit`, `hersteller`, `Version`, `Produktname`, `Name`, `Status` FROM `Bearbeiter`, `Software`, `paket`


    Besser noch mit JOIN aber wenn du in allen deinen Tabellen keine Spaltennamen hast die doppelt vorkommen geht's auch so.

    Das fragst du dann ab mit @mysql_fetch_assoc, besser NICHT mit mysql_fetch_array und MYSQL_NUM weil wenn du neue Spalten hinzufügst kommst irgendwann ins schludern und darfst in allen PHP Dateien den Code entsprechend korrigieren. Nimm also mysql_fetch_assoc und greife über den Spaltennamen auf die Werte zu (Beispiel: $row['Name_edit'] und nicht $row['2'] oder sonst ein Index). Siehe auch "assoziative Arrays".

    Link :thumbup:
    Hello World

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Link275“ ()

    SO hab ich es auch nur der klu an den ganzen ist, das ich nur die Daten haben will, die von den Kunden XY stammen.
    Das Kundenname wird mittels Get von einer anderen Seite übermittelt deswegen wurde mich auch gesagt das die Spalte "kunde" mehrdeutig ist da jede Tabelle eine Spalte mit "Kunde" hat mittels dieser wird dann das ganze einem Kunden zugeteilt.

    SQL-Abfrage

    1. SELECT `Editor`, `Name_edit`, `hersteller`, `Version`, `Produktname`, `Name`, `Status` FROM `Bearbeiter`, `Software`, `paket` WHERE `Bearbeiter`.`Kunde` = 'John Wayne' AND `Software`.`Kunde` = 'John Wayne` AND `paket`.`Kunde` = 'John Wayne'


    ...möglicherweise. Aber das is irgendwie alles Blödsinn. Ich hab das Gefühl als wäre dein Datenbankaufbau ein einziges Chaos. Könntest du mal einen SQL Export machen (ohne Daten) damit die Struktur deiner Datenbank ersichtlich ist?


    Link :thumbup:
    Hello World
    Habs mal Angehangen. Die .zip datei im Anhang ist der Export ohne Daten
    Dateien
    • test.sql.zip

      (618 Byte, 119 mal heruntergeladen, zuletzt: )