Ankündigung

Einklappen
Keine Ankündigung bisher.

MYSQL Abfrage auf 4 Tabellen

Einklappen

Neue Werbung 2019

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

  • MYSQL Abfrage auf 4 Tabellen

    Hallo,

    habe jeweils 4 Tabellen : customer, bank, deliveryaddress und contact.

    Primärschlüssel in "customer" ist "ID" und diese ID ist jeweils der Fremdschlüssel in den anderen Tabellen, welchen ich in allen Tabellen "customerID" genannt habe.

    Nach Eingabe der KundenID lasse ich mir jeweils die persönlichen Daten des Kunden in "customer", seine Bankdaten in "bank", sowie seine Lieferadresse in "deliveryaddress"
    als JSON ausgeben, was auch funktionniert.

    Nun zu meiner Frage : ich habe eine vierte Tabelle angelegt ("contacts"), in der ich die verschiedenen Kontakte des Kunden anlege.

    Bisher war es so, daß er nur jeweils eine Bank und eine Lieferadresse angeben kann. Nach der Abfrage erhielt ich dann auch genau einen Datensatz mit allen Angaben
    der Tabellen customer, bank und deliveryaddress.

    Was seine Kontakte angeht, möchte ich nun mehrere Eingaben ermöglichen.

    Seit dem ich meine Datenbankabfrage für diese zusätzliche Tabelle ergänzt hab (also LEFT JOIN contact as co ON c.id = co.customerID hinzugefügt),
    erhalte ich genau so viele Datensätze zurück wie ich für diese ID Kontakte angelegt habe.

    D.h. wenn ich z.B. 3 Kontakte für einen Kunden anlege, erhalte ich dann 3 komplette Datensätze (ich erhalte also mehrmals die gleichen Daten für meine ersten 3 Tabellen
    was natürlich nicht erwünscht ist) in meinem Response Array :

    z.B. [{"id":1,"company":null,"familyName":"Müller", "name":"Max" ...,"emailContact":"xyz@xyz.de","phoneContact":"+4 9 123 123 123" ... },
    [{"id":1,"company":null,"familyName":"Müller2", "name":"Max2" ...,"emailContact":"xyz2@xyz.de","phoneContact":"+ 49 123 123 123" ... },
    [{"id":1,"company":null,"familyName":"Müller3", "name":"Max3" ...,"emailContact":"xyz3@xyz.de","phoneContact":"+ 49 123 123 123" ... }]

    Wie kann ich meine Abfrage umändern, damit ich einen Datensatz ohne sich wiederholdende Daten erhalte ? Ist dies überhaupt möglich mit einer Abfrage ?


    SELECT
    c.id, c.company, c.familyName, c.firstName, c.vat, c.street, c.postalCode, c.city, c.countryCode, c.country, c.dateOfBirth, c.phone, c.cellphone, c.email, c.fax,
    c.website, c.status, c.created, c.modified, c.notice, c.salutation, b.bank, b.iban, b.account, b.bankCode, b.bic, d.deliveryName, d.deliveryStreet, d.deliveryPostalCode,
    d.deliveryCountryCode, d.deliveryCity, d.deliveryCountry, co.name, co.mission, co.emailContact, co.phoneContact, co.cellphoneContact
    FROM customer as c
    LEFT JOIN bank as b
    ON c.id = b.customerID
    LEFT JOIN deliveryAddress as d
    ON c.id = d.customerID
    LEFT JOIN contact as co
    ON c.id = co.customerID
    WHERE c.id = 1

  • #2
    wenn Du tatsächlich dann "Müller", "Müller2" und "Müller3" bekommst sind das unterschiedliche Datensätze. Zu Deine Frage: aggregiere das halt.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3

      Moin,
      wollte mein JSON Ergebnis nicht hier eins zu eins kopieren und hab die Ergebnis Daten schlecht verfremdet, hier ein besserer Versuch mit dem Ergebins, wie ich es bei 3 Kontakten erhalte:

      [{"id":1,"company":null,"familyName":"Müller","firs tName":"Max","vat":null,"street":"Musterstrasse 1","postalCode":"52078","city":"Aachen","countryCo de":"DE","country":"Deutschland","dateOfBirth":"19 72-06-06","phone":null,"cellphone":"+49 000000","email":"mueller@gmail.com","fax":null,"we bsite":"mueller@com","status":0,"created":null,"mo dified":null,"notice":"gut zahlender Kunde","salutation":"Herr","bank":"Kommerzbank","i ban":"DE000 000 000","account":"123456789","bankCode":"1234","bic" :"AAA000","deliveryName":"Spedition XYZ","deliveryStreet":"Lieferstrasse 1","deliveryPostalCode":"52000","deliveryCountryCo de":"DE","deliveryCity":"Köln","deliveryCountry":" Deutschland","name":"Kontakt1","mission":"Verkäufe","emailConta ct":"emailkontakt1t@yahoo.de","phoneContact":"+4 9 00000001","cellphoneContact":"+49 171 000001"},{"id":1,"company":null,"familyName":"Müller","fi rstName":"Max","vat":null,"street":"Musterstrasse 1","postalCode":"52078","city":"Aachen","countryCo de":"DE","country":"Deutschland","dateOfBirth":"19 72-06-06","phone":null,"cellphone":"+49 000000","email":"mueller@gmail.com","fax":null,"we bsite":"mueller@com","status":0,"created":null,"mo dified":null,"notice":"gut zahlender Kunde","salutation":"Herr","bank":"Kommerzbank","i ban":"DE000 000 000","account":"123456789","bankCode":"1234","bic" :"AAA000","deliveryName":"Spedition XYZ","deliveryStreet":"Lieferstrasse 1","deliveryPostalCode":"52000","deliveryCountryCo de":"DE","deliveryCity":"Köln","deliveryCountry":" Deutschland","name":"Kontakt2","mission":"Sales manager","emailContact":"emailkontakt2@yahoo.de"," phoneContact":"+49 00000002 521","cellphoneContact":"49 171 000002"},{"id":1,"company":null,"familyName":"Müller","fi rstName":"Max","vat":null,"street":"Musterstrasse 1","postalCode":"52078","city":"Aachen","countryCo de":"DE","country":"Deutschland","dateOfBirth":"19 72-06-06","phone":null,"cellphone":"+49 000000","email":"mueller@gmail.com","fax":null,"we bsite":"mueller@com","status":0,"created":null,"mo dified":null,"notice":"gut zahlender Kunde","salutation":"Herr","bank":"Kommerzbank","i ban":"DE000 000 000","account":"123456789","bankCode":"1234","bic" :"AAA000","deliveryName":"Spedition XYZ","deliveryStreet":"Lieferstrasse 1","deliveryPostalCode":"52000","deliveryCountryCo de":"DE","deliveryCity":"Köln","deliveryCountry":" Deutschland","name":"Kontakt3","mission":"Aussendienst","emailC ontact":"emailkontakt3@yahoo.de","phoneContact":"+ 49 000000003","cellphoneContact":"49 00003"}]

      Wie du siehst, bekomme ich bei meiner aktuellen Abfrage zwar alle meine vorhandenen Daten der Tabelle "contact" (ich hab dieses Ergebnis mal zwecks besserer Übersichtlichkeit in fett markiert),
      jedoch auch leider 3 x (also immer genau so oft wie ich Datensätze in Tabelle "contact" mit der gesuchten id hab) die gleichen Daten meiner Tabellen customer, bank sowie deliveryaddress.

      Wenn ich die Abfrage splitte, erhalte ich keine redundanten Daten, aber dann sind es halt 2 Abfragen :

      SELECT c.id, c.company, c.familyName, c.firstName, c.vat, c.street, c.postalCode, c.city, c.countryCode, c.country, c.dateOfBirth, c.phone, c.cellphone, c.email, c.fax, c.website, c.status, c.created, c.modified, c.notice, c.salutation, b.bank, b.iban, b.account, b.bankCode, b.bic, d.deliveryName, d.deliveryStreet, d.deliveryPostalCode, d.deliveryCountryCode, d.deliveryCity, d.deliveryCountry FROM customer as c LEFT JOIN bank as b ON c.id = b.customerID LEFT JOIN deliveryAddress as d ON c.id = d.customerID
      SELECT customer.id, c.name, c.mission, c.emailContact, c.phoneContact, c.cellphoneContact FROM customer LEFT JOIN contact as c ON customer.id = c.customerID WHERE customer.id = 1
      Zu Deine Frage: aggregiere das halt.
      Hab mal unter Aggregation nachgeschaut, kenne hinter diesem Begriff nur Funktionen wie min, max addieren etc und weiss nicht,
      wie mir das bei meinem Problem helfen kann.



      Kommentar


      • #4
        Code:
        test=*# select name, json_agg(phone) from midget group by name;
          name  |           json_agg           
        --------+------------------------------
         müller | ["123", "234", "345", "456"]
        (1 row)
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Bitte die Tabellenstrukturen und Beispieldaten als SQL-Code posten. Diese JSON-Würste helfen niemandem was.

          Kommentar


          • #6
            Anbei die Tabellen + Testdaten :

            Code:
            CREATE TABLE `customer` (
             `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
             `company` varchar(60) CHARACTER SET utf8 COLLATE utf8_german2_ci DEFAULT NULL,
             `familyName` varchar(40) CHARACTER SET utf8 COLLATE utf8_german2_ci NOT NULL,
             `firstName` varchar(30) CHARACTER SET utf8 COLLATE utf8_german2_ci NOT NULL,
             `salutation` varchar(15) NOT NULL,
             `vat` varchar(15) DEFAULT NULL,
             `street` varchar(60) NOT NULL,
             `postalCode` varchar(7) NOT NULL,
             `city` varchar(50) CHARACTER SET utf8 COLLATE utf8_german2_ci NOT NULL,
             `countryCode` char(2) DEFAULT NULL,
             `country` varchar(35) CHARACTER SET utf8 COLLATE utf8_german2_ci NOT NULL,
             `dateOfBirth` date DEFAULT NULL,
             `phone` varchar(20) DEFAULT NULL,
             `cellphone` varchar(20) DEFAULT NULL,
             `email` varchar(50) DEFAULT NULL,
             `fax` varchar(20) DEFAULT NULL,
             `website` varchar(50) DEFAULT NULL,
             `status` tinyint(1) DEFAULT NULL,
             `notice` text,
             `created` date DEFAULT NULL,
             `modified` date DEFAULT NULL,
             PRIMARY KEY (`id`),
             KEY `idx_company` (`company`),
             KEY `idx_name` (`familyName`,`firstName`)
            ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
            INSERT INTO `customer`(`id`, `company`, `familyName`, `firstName`, `salutation`, `vat`, `street`, `postalCode`, `city`, `countryCode`, `country`, `dateOfBirth`, `phone`, `cellphone`, `email`, `fax`, `website`, `status`, `notice`, `created`, `modified`) VALUES (7,'Müller AG','Mustermann', 'Max', 'Herr', 'DE412 123 458', 'Musterstrasse 2', '52078', 'Aachen', 'DE', 'Deutschland', '1972-06-06', '+49 241 000000', '49 171 000000', 'maxmustermann@yahoo.de', '+49 00000000', 'mueller-verputzer.com', 0, 'gute Zahlungsmoral', '2020-04-01', '2020.05.22')

            Code:
            CREATE TABLE `bank` (
             `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
             `bank` varchar(50) DEFAULT NULL,
             `iban` varchar(34) DEFAULT NULL,
             `account` varchar(10) DEFAULT NULL,
             `bankCode` varchar(9) DEFAULT NULL,
             `bic` varchar(15) DEFAULT NULL,
             `customerID` int(10) unsigned NOT NULL,
             PRIMARY KEY (`id`),
             KEY `customerID` (`customerID`),
             CONSTRAINT `bank_ibfk_1` FOREIGN KEY (`customerID`) REFERENCES `customer` (`id`)
            ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
            INSERT INTO `bank`(`id`, `bank`, `iban`, `account`, `bankCode`, `bic`, `customerID`)
            VALUES (5, 'Kommerzbank', 'DE 123 123 123', '123 123', '123 000', 'GBA012', 7)

            Code:
            CREATE TABLE `deliveryaddress` (
             `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
             `deliveryName` varchar(60) DEFAULT NULL,
             `deliveryStreet` varchar(60) DEFAULT NULL,
             `deliveryPostalCode` varchar(7) DEFAULT NULL,
             `deliveryCity` varchar(50) DEFAULT NULL,
             `deliveryCountryCode` char(2) DEFAULT NULL,
             `deliveryCountry` varchar(35) DEFAULT NULL,
             `customerID` int(10) unsigned NOT NULL,
             PRIMARY KEY (`id`),
             KEY `customerID` (`customerID`),
             CONSTRAINT `deliveryaddress_ibfk_1` FOREIGN KEY (`customerID`) REFERENCES `customer` (`id`)
            ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
            INSERT INTO `deliveryaddress`(`id`, `deliveryName`, `deliveryStreet`, `deliveryPostalCode`, `deliveryCity`, `deliveryCountryCode`, `deliveryCountry`, `customerID`)
            VALUES (4, 'Spedition XYZ', 'Lieferstrasse 1', '52000', 'Köln', 'DE', 'Deutschland', 7)

            Code:
            CREATE TABLE `contact` (
             `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
             `customerID` int(10) unsigned DEFAULT NULL,
             `name` varchar(60) DEFAULT NULL,
             `mission` varchar(60) DEFAULT NULL,
             `phoneContact` varchar(60) DEFAULT NULL,
             `emailContact` varchar(60) DEFAULT NULL,
             `cellphoneContact` varchar(60) DEFAULT NULL,
             PRIMARY KEY (`id`),
             KEY `customerID` (`customerID`),
             CONSTRAINT `contact_ibfk_1` FOREIGN KEY (`customerID`) REFERENCES `customer` (`id`)
            ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
            INSERT INTO `contact`(`id`, `customerID`, `name`, `mission`, `phoneContact`, `emailContact`, `cellphoneContact`)
            VALUES (10, 7, 'Donald Duck', 'Unterhaltung', '+49 000 001', 'donald@disney.us', '+49 123 123 1' ), (11, 7, 'Mickey Mouse', 'Ticket Verkauf', '+49 000 002', 'mickey@disney.us', '+49 123 123 2'), (12, 7, 'Phantomas', 'Gruselmonster', '+49 000 003', 'phantomas@grusel.com', '+49 123 123 3')

            Kommentar


            • #7
              Du wirst das doch irgendwo so wie so auseinander fummeln müssen. Entweder bei der Abfrage der Daten, wobei mir das mit der Aggregation an der Stelle dann auch ein Rätsel ist oder bei der Ausgabe.

              Also ich würde entweder zwei Abfragen machen oder Dein Abfrageergebnis aus #1 so auslesen, dass Du da eben prüfst, ob die company id sich geändert hat und die Ausgabe entsprechend anpassen.
              [B]Es ist schon alles gesagt. Nur noch nicht von allen.[/B]

              Kommentar


              • #8
                Hab letztendlich eine zweite Abfrage gemacht, danke.

                Kommentar

                Lädt...
                X