Announcement

Collapse
No announcement yet.

Joins das ewige Rätsel für mich

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Joins das ewige Rätsel für mich

    Hallo Leute,

    wenn es etwas gibt, dass ich einfach nicht kapiere, dann JOINS. Ich bin da einfach zu blöd für.

    Ich habe drei Tabellen, wobei eine die Verbindung der Datensätze regelt:

    1) clients
    Code:
    CREATE TABLE IF NOT EXISTS `client` (
      `label` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
      `clienttype` varchar(250) COLLATE utf8_unicode_ci DEFAULT 'Mandant',
      `ObjectID` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
      PRIMARY KEY (`ObjectID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    2) company
    Code:
    CREATE TABLE IF NOT EXISTS `company` (
      `label` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
      `companyname` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
      `ObjectID` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
      PRIMARY KEY (`ObjectID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    3) client_acompany
    Code:
    CREATE TABLE IF NOT EXISTS `client_acompany` (
      `data` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
      `parentid` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
      PRIMARY KEY (`parentid`,`seq`),
      KEY `data_index` (`data`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    Was ich jetzt brauche ist clienttype, label von "client", aber nur die Datensätze deren ObjectID der ParentID der "client_acompany" entspricht, gefiltert auf jeweils eine ObjectID der "company", die data "client_acompany" entspricht.
    Ich übergebe also immer die ObjectID der "comany" Tabelle.

    Kann mir dabei jemand helfen?

    Danke
    Kay
    Zuletzt editiert von kay899; 10.11.2012, 13:48.

  • #2
    Originally posted by kay899 View Post
    Hallo Leute,
    Was ich jetzt brauche ist clienttype, label von "client", aber nur die Datensätze deren ObjectID der ParentID der "client_acompany" entspricht, gefiltert auf jeweils eine ObjectID der "company", die data "client_acompany" entspricht.
    Ich übergebe also immer die ObjectID der "comany" Tabelle.

    Kann mir dabei jemand helfen?
    Im Prinzip ja. Aber zuerst solltest du deine Frage als SELECT formulieren (ich hoffe doch, du hast schon etwas probiert) mit WHERE und einem JOIN-Versuch. Hier gibt es vor allem Hilfe zur Selbsthilfe. Deine Anforderung "was ich brauche" ist zu kompliziert formuliert. Es sollte verständlicher werden, wenn du es selbst in Quasi-Code umsetzt; schließlich ist SQL der natürlichen englischen Sprache nachempfunden. Den Code zumindest eines Versuchs solltest du hier eintragen.

    wenn es etwas gibt, dass ich einfach nicht kapiere, dann JOINS. Ich bin da einfach zu blöd für.
    Und ich bin zu blöd, durch deinen Beitrag durchzusteigen.
    • Streiche in deinen Code-Auszügen alles, was mit dem Problem nichts zu tun hat: überflüssige Spalten, collate, defaults, nullable, Engine und dergleichen.
    • Ergänze aber auf jeden Fall die ForeignKeys.
    • Und vor allem benutze die CODE-Tags, damit der Code lesbarer wird. Wozu werden die wohl beim Eingabefenster angezeigt?!

    Diese Korrekturen kannst du auch nachträglich vornehmen. Gehe dazu zu deinem ersten Beitrag und klicke auf "Ändern".

    Zum Thema verweise ich auf die SQL-Einführung. Vielleicht hilft auch die Übersicht im Kapitel "Mehr zu JOIN" über "Welcher JOIN hilft wann". Jürgen

    Comment


    • #3
      Erklär, wenn du es nochmal versuchst verständlicher zu erklären, auch den Sinn und Funktionsweise der client_acompany Tabelle. Erklärung und Naming läßt erstmal eine Mappingtabelle (für eine n:n Beziehung) zwischen client und company vermuten das ist aber scheinbar nicht so.

      Es würde allgemein (und insbesondere hier uns) helfen die Dinge auch so zu benennen wie sie gebraucht und referenziert werden. Zum Beispiel parentid in client_acompany. Wenn das immer ein ForeignKey auf die client Tabelle ist dann sollte die auch so heißen also zum Beispiel clientID. Und wenn du denn PrimaryKey in den Tabellen auch so nennst (also den PK von Client auch clientID) dann kann auch jeder andere außer dir verstehen wie die Dinge zusammenhängen. Wenn das Ding parentID heißt weil der Parent wechselt also zum Beispiel mal client und mal company referenziert. Tja, dann kann ich nur sagen hast du kein Problem mit Joins sondern grundsätzliche Probleme mit der Erstellung eines nutzbarem relationalem Datenbankdesigns.

      Comment


      • #4
        Erstmal danke. Ich habe den Code im ersten Beitrag mal getrafft und überarbeitet.

        Hier auch der Versuch, den ich natürlich vorher auch gestartet habe:

        Code:
        SELECT clienttype c, label c
        FROM client c, client_acompany a
        WHERE c.ObjectID= a.parentID 
        AND a.data = "586F8D30-1AB3-11E2-991C18A905C1FCC7"
        Wobei "586F8D30-1AB3-11E2-991C18A905C1FCC7" eine ObjectID der "company" Tabelle ist, nach der ich filtern will.

        Das Datenbank Design wird über das Framework dass ich nutze komplett selber erzeugt, da habe ich keinen Einfluß drauf.

        Danke, Kay

        Comment


        • #5
          Von dem was du beschreibst und was wir in die Datenbankstruktur reininterpretieren können sieht das richtig aus.

          Syntax eher

          [Highlight=SQL]
          SELECT c.clienttype, c.label
          FROM client c
          inner join client_acompany a on c.ObjectID = a.parentID
          WHERE a.data = "586F8D30-1AB3-11E2-991C18A905C1FCC7"[/Highlight]

          Wenn das nicht das gewünschte liefert solltest du sagen was du bekommst und was du stattdessen erhofft hast. Vielleicht wird es dann für uns verständlich.

          Comment


          • #6
            Danke Ralf!!!
            Das war genau das was ich brauchte. :-)

            Jetzt wird es noch spannend diese angepasste Abfrage meinem Framework beizubiegen...

            Comment


            • #7
              Ralf hat genau dieselbe Vermutung wie ich. Dann wäre dein Ursprungsproblem gar nicht der JOIN selbst, sondern die Schreibweise von Spalten zusammen mit Tabelle und Tabellen-Alias. Deshalb hatte ich auch nach der Anforderung in "natürlicher Sprache" gefragt. Das sieht dann etwa so aus:
              Code:
              Gib mir
                  c.clienttype, c.label
              aus der Tabelle client c
                  wobei client mit acompany a verbunden ist
                          durch die Beziehung
              aber nur soweit a.Data gleich "..." ist
              In dieser Form kannst du dir das meistens herleiten. Jürgen

              Comment


              • #8
                Mache ich beim nächsten mal so. Danke!!!

                Comment

                Working...
                X