Ankündigung

Einklappen
Keine Ankündigung bisher.

Mysql abfrage über mehrere Tabellen richtig Sortiert ausgeben.

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mysql abfrage über mehrere Tabellen richtig Sortiert ausgeben.

    Hallo Leute,

    ich komme mit einer Datenbank abfrage nicht weiter,
    die Funktioniert schon nur erhalte ich die nicht in richtiger Form ausgegeben.
    Also ich hab 3 Tabellen die Haupttabelle ist Produkt, wen ich ein Produkt hinzufüge und eine/mehrere/keine Kategorie auswähle,
    wird in der Tabelle kategorie_zuordnung dann ein eintrag gemacht wenn eine Kategorie ausgewählt wurde.

    Das geht alles soweit gut, jetzt will ich nach einer bestimmten Kategorie Sortieren und die Restlichen am Ende mit anzeigen.
    Nur die Treffer auszugeben, ist ja kein Problem nur die anderen dazu mit auszugeben klappt bei mir nicht so richtig und die ausgabe Soollte auf Seiten aufgeteilt werden mit LIMIT.
    Daher kann ich da schlecht getrennte abfragen nutzen und die dann zusammen verbinden.

    So erhalte ich ja nur alle Treffet:
    Code:
    "SELECT A.* FROM
        produkt AS A LEFT JOIN
        kategorie_zuordnung AS B ON (A.id = B.pr_id) LEFT JOIN
        kategorie AS C ON (B.kategorie = C.id)
        WHERE C.kategorie =  'Kneifzange'"
    Und so erhalte ich es schon mal fast richtig, die meisten Treffer werden am anfang ausgegeben aber einige auch dazwischen.
    Code:
    "SELECT A.* FROM
        produkt AS A LEFT JOIN
        kategorie_zuordnung AS B ON (A.id = B.pr_id) LEFT JOIN
        kategorie AS C ON (B.kategorie = C.id)
        WHERE ORDER BY C.kategorie =  'Kneifzange' ASC"
    So ist die Datenbank aufgebaut:
    Bildschirmfoto 2018-07-05 um 12.15.54.png

    Das Problem liegt dadrin das einige Produkte in zwei oder auch mehr Kategorien zugewiesen sind und die dadurch an verschiedenen Positionen ausgegeben werden.

    Kann mir da einer weiter helfen wie ich das machen kann?
    Angehängte Dateien


  • #2
    Was soll denn deiner Meinung nach rauskommen? Und produzier mal lauffähigen Code, oder sollen wir die Tabellen hier abschreiben...
    You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.

    Kommentar


    • #3
      Das geht alles soweit gut, jetzt will ich nach einer bestimmten Kategorie Sortieren und die Restlichen am Ende mit anzeigen.
      Du kannst im ORDER BY auch Funktionen/Ausdrücke benutzen: ORDER BY kategorie = 'beispiel' DESC

      Kommentar


      • #4
        Du brauchst 2 Abfragen, ein mal mit der gewählten Kategorie und ein mal ohne diese
        1. ...WHERE C.kategorie = 'Kneifzange' ORDER BY C.kategorie ASC"
        2. ...WHERE C.kategorie <> 'Kneifzange' "
        Diese verbindest du dann mit einem UNION. so dass diese zusammen ausgegeben werden.

        Kommentar


        • #5
          Hallo Dormilich,
          danke für denn hinweis, aber das hab ich schon in meinem Zweiten Code verwendet.
          Das Problem ist ja der ich irgendwie die ID Sprerren muss, bei der 'Kneifzange' vorkam.

          Hallo protestix,
          kann man UNION mit JOIN nutzen?
          Zitat von protestix Beitrag anzeigen
          Du brauchst 2 Abfragen, ein mal mit der gewählten Kategorie und ein mal ohne diese
          1. ...WHERE C.kategorie = 'Kneifzange' ORDER BY C.kategorie ASC"
          2. ...WHERE C.kategorie <> 'Kneifzange' "
          Diese verbindest du dann mit einem UNION. so dass diese zusammen ausgegeben werden.

          Hier mal eine andere Test Datenbank die ich aus dem Netz habe:
          Code:
          /* Kontaktbezeichnungen */
          CREATE TABLE kontakt_bez (
           kontakt_bez_id INT NOT NULL,
           bezeichnung VARCHAR(50) NOT NULL,
           PRIMARY KEY (kontakt_bez_id)
          ) ENGINE = InnoDB;
          
          /* Personen */
          CREATE TABLE person (
           person_id INT NOT NULL,
           vorname VARCHAR(50) NOT NULL,
           nachname VARCHAR(50) NOT NULL,
           PRIMARY KEY (person_id)
          ) ENGINE = InnoDB;
          
          /* person_hat_kontakt */
          CREATE TABLE person_kontakt (
           person_kontakt_id INT NOT NULL,
           person_id INT NOT NULL,
           kontakt_bez_id INT NOT NULL,
           wert VARCHAR(50) NOT NULL,
           bemerkung VARCHAR(50),
           PRIMARY KEY (person_kontakt_id),
           CONSTRAINT fk_person
            FOREIGN KEY (person_id)
             REFERENCES person (person_id)
             ON DELETE CASCADE,
           CONSTRAINT fk_kontakt_bez
            FOREIGN KEY (kontakt_bez_id)
             REFERENCES kontakt_bez (kontakt_bez_id)
             ON DELETE RESTRICT
          )  ENGINE = InnoDB;
          
          INSERT INTO kontakt_bez VALUES 
          ( 1, 'Telefon privat' ),
          ( 2, 'Telefon geschäftlich' ),
          ( 3, 'Telefax geschäftlich' ),
          ( 5, 'E-Mail privat' ),
          ( 6, 'E-Mail geschäftlich' ),
          ( 7, 'Mobil privat' ),
          ( 8, 'Mobil geschäftlich' ),
          ( 9, 'Web-Seite' ),
          (10, 'Facebook' ),
          (11, 'Skype' ),
          (12, 'Bankkonto Kaiman-Inseln' );
          
          
          INSERT INTO person VALUES 
          ( 1, 'Vorname-1','Nachname-1' ),
          ( 2, 'Vorname-2','Nachname-2' ),
          ( 3, 'Vorname-3','Nachname-3' );
          
          INSERT INTO person_kontakt VALUES 
          ( 1, 1, 1, '0049-0089-12345678' , NULL),
          ( 2, 1, 9, 'http://www.twiedmann.de', NULL ),
          ( 3, 2, 5, 'vorname2.nachname2@dort.de', NULL ),
          ( 4, 2, 9, 'http://www.nachname2.de', NULL ),
          ( 5, 2, 7, '0152-00000000', 'lange klingeln lassen!' ),
          ( 6, 3, 2, '0049-0089-11111111', 'Sekretärin: Frau Immerda' ),
          ( 7, 3,12, 'X12-all-ES-mEiNs', 'Passwort liegt beim Pförtner' );
          Hier die Abfrage die mir ja Trotzdem die Person mit dem Vornamen1 ausgibt, da es ja noch andere einträge zu der Person gibst:
          Code:
          SELECT p.vorname, p.nachname, kb.bezeichnung, pk.wert
                                FROM person p JOIN
                                person_kontakt pk ON p.person_id = pk.person_id JOIN
                                kontakt_bez kb ON pk.kontakt_bez_id = kb.kontakt_bez_id
                                WHERE pk.kontakt_bez_id <> 1
          nur wie kann ich bei der Abfrage es so machen, das wenn eine Person <> 1 ist, es auch keine weiteren ausgaben zu der Person gibst, ausser erst am Ende durch die zweite abfrage?

          Und vielen dank für die schnellen Antworten.

          Kommentar


          • #6
            Hier mal eine andere Test Datenbank die ich aus dem Netz habe:
            Was soll der Quatsch?

            Wenn du ein Problem hast, dann zeige deine Datenbank mit deinen Daten und keine Fantasiedatenbank.

            Kommentar


            • #7
              Zitat von protestix Beitrag anzeigen
              Was soll der Quatsch?

              Wenn du ein Problem hast, dann zeige deine Datenbank mit deinen Daten und keine Fantasiedatenbank.
              Diese Fantasiedatenbank ist vom aufbau so wie meine Originale,
              nur das meine Originale sehr viel Großer und um die 100000 Datensetze hat mit persönlichen daten.
              Und diese Fantasiedatenbank nutze ich gerade bei mir, da es dadurch zum testen Übersichtlicher ist, wenn es mit der Test Datenbank Funktioniert wird es mit der Originalen auch gehen.
              und da kann ich auch die Daten in der Datenbank ändern um verschiedene Varianten zu Testen.

              Edit 09.07.2018

              So hab es jetzt doch selbst hinbekommen und es funktioniert zu 100% so wie gewünscht.
              hier der Code wenn jemand das gleiche Problem haben wird:
              Code:
                    SELECT p.vorname, p.nachname
                          FROM person p JOIN
                                 person_kontakt pk ON p.person_id = pk.person_id JOIN
                                 kontakt_bez kb ON pk.kontakt_bez_id = kb.kontakt_bez_id
                                    WHERE pk.person_id NOT IN
                                                              ( SELECT person_id
                                                                  FROM person_kontakt
                                                                  WHERE kontakt_bez_id = 1
                                                              )
                 UNION DISTINCT
                    SELECT p.vorname, p.nachname
                           FROM person p JOIN
                                  person_kontakt pk ON p.person_id = pk.person_id JOIN
                                  kontakt_bez kb ON pk.kontakt_bez_id = kb.kontakt_bez_id
                                    WHERE pk.kontakt_bez_id = 1 LIMIT 10

              Kommentar


              • #8
                Zitat von Grengou Beitrag anzeigen

                UNION DISTINCT
                Das DISTINCT kannst du dir sparen. UNION filtert immer die Duplikate raus. Es sei denn, du nutzt UNION ALL

                Kommentar


                • #9
                  Code:
                  SELECT p.vorname, p.nachname
                              FROM person p JOIN
                                     person_kontakt pk ON p.person_id = pk.person_id JOIN
                                     kontakt_bez kb ON pk.kontakt_bez_id = kb.kontakt_bez_id
                                        WHERE pk.person_id NOT IN
                                                                  ( SELECT person_id
                                                                      FROM person_kontakt
                                                                      WHERE kontakt_bez_id = 1
                                                                  )
                  Sollte identisch sein mit
                  Code:
                   SELECT
                      p.vorname, p.nachname
                   FROM
                      person p
                   JOIN
                      person_kontakt pk
                      ON p.person_id = pk.person_id
                   JOIN
                      kontakt_bez kb
                      ON pk.kontakt_bez_id = kb.kontakt_bez_id
                          AND pk.kontakt_bez_id <> 1:

                  Kommentar

                  Lädt...
                  X