Ankündigung

Einklappen
Keine Ankündigung bisher.

SELECT in procedure

Einklappen

Neue Werbung 2019

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

  • SELECT in procedure

    Hallo,

    habe ein problem beim erstellen einer procedure zum eintragen von daten bei einer n:m verbindung.
    habe relativ wenig erfahrung mit Stored Procedures und egal wie viel ich google ich finde nicht das passende.

    Code:
    BEGIN
    INSERT INTO anmeldungen (`email`)
    VALUES ('email');
    SET @aID = LAST_INSERT_ID();
    
    SELECT id AS eID
    FROM expertise
    WHERE `name` = '@var';
    
    INSERT INTO anmeldungen_has_expertise (`anmeldungen_id`, `expertise_id`)
    VALUES (@aID,@eID);
    
    
    END
    Das hier habe ich bereits...wie bekomme ich die id beim SELECT so raus das ich sie beim Insert verwenden kann?

    Lg.


    Edit:/
    Mein nächster Versuch war das hier:
    Code:
    BEGIN
    DECLARE eID int(12) DEFAULT 0;
    DECLARE aID int(12) DEFAULT 0;
    
    INSERT INTO anmeldungen (`email`)
    VALUES ('email');
    SET aID = LAST_INSERT_ID();
    
    SELECT id INTO eID
    FROM expertise
    WHERE `name` LIKE '%@var%';
    
    INSERT INTO anmeldungen_has_expertise (`anmeldungen_id`, `expertise_id`)
    VALUES (aID,eID);
    
    END
    Klappt auch nicht :%

  • #2
    Zitat von illmaren Beitrag anzeigen
    Hallo,

    habe ein problem beim erstellen einer procedure zum eintragen von daten bei einer n:m verbindung.
    habe relativ wenig erfahrung mit Stored Procedures und egal wie viel ich google ich finde nicht das passende.

    Code:
    BEGIN
    INSERT INTO anmeldungen (`email`)
    VALUES ('email');
    SET @aID = LAST_INSERT_ID();
    
    SELECT id AS eID
    FROM expertise
    WHERE `name` = '@var';
    
    INSERT INTO anmeldungen_has_expertise (`anmeldungen_id`, `expertise_id`)
    VALUES (@aID,@eID);
    
    
    END
    Das hier habe ich bereits...wie bekomme ich die id beim SELECT so raus das ich sie beim Insert verwenden kann?

    Lg.


    Edit:/
    Mein nächster Versuch war das hier:
    Code:
    BEGIN
    DECLARE eID int(12) DEFAULT 0;
    DECLARE aID int(12) DEFAULT 0;
    
    INSERT INTO anmeldungen (`email`)
    VALUES ('email');
    SET aID = LAST_INSERT_ID();
    
    SELECT id INTO eID
    FROM expertise
    WHERE `name` LIKE '%@var%';
    
    INSERT INTO anmeldungen_has_expertise (`anmeldungen_id`, `expertise_id`)
    VALUES (aID,eID);
    
    END
    Klappt auch nicht :%
    Wie soll es denn aussehen, wenn es klappt? Und wie sieht es aus?

    Ich habe den Verdacht, daß das, was du da tust, Unfug ist. Aber mit den wenigen Informationen kann man es nicht beurteilen. Also:
    1. Wie sieht deine Tabelle anmeldungen vor dem Ausführen der Procedure aus? Wie sieht die Tabelle anmeldungen_has_expertise vor dem Ausführen aus?
    2. Wie sehen die beiden Tabellen nach dem Ausführen aus?
    3. Wie sollen sie nach deiner Vorstellung aussehen?
    Dann post bitte einen DB-Dump. Und erkläre mal ein bischen das "Drumrum". Was soll das ganze? Warum gibt es nicht eine Tabelle mit allen, die sich per Email anmelden, mit Name, Vorname usw.? Dort könnte es dann auch ein Feld "has_expertise" geben. Warum wählst du nicht diesen Weg?

    Kommentar


    • #3
      Tabellen sehen so aus
      Code:
      anmeldungen
      id INT, email varchar(255)
      
      anmeldungen_has_expertise
      anmeldungen_id INT, expertise_id INT
      
      expertise
      id INT, name text
      Wie man anhand der Tabellen sehen kann handelt es sich hier um eine N:M Verbindung
      Expertise hat bereits werte aus dennen ausgewählt werden soll.

      Jetzt sollen E-Mail Addressen mit den Werten aus der Expertise Tabelle eingetragen und gleichzeitig durch die zwischentabelle mit einer oder mehrerer expertises verbunden werden. (Beim eintragen hier jedoch erstmal nur mit einer) Im weiteren vorgehen von mir soll auch gleichzeitig ein Check reinkommen worin überprüft wird ob die E-Mail bereits vorhanden ist oder nicht.

      Sorry, dachte das es sich hier um eine N:M Verbindung handelt sieht man anhand der Zwischentabelle.

      Kommentar


      • #4
        Zitat von illmaren Beitrag anzeigen
        Tabellen sehen so aus
        Code:
        anmeldungen
        id INT, email varchar(255)
        
        anmeldungen_has_expertise
        anmeldungen_id INT, expertise_id INT
        
        expertise
        id INT, name text
        Wie man anhand der Tabellen sehen kann handelt es sich hier um eine N:M Verbindung
        Expertise hat bereits werte aus dennen ausgewählt werden soll.

        Jetzt sollen E-Mail Addressen mit den Werten aus der Expertise Tabelle eingetragen und gleichzeitig durch die zwischentabelle mit einer oder mehrerer expertises verbunden werden. (Beim eintragen hier jedoch erstmal nur mit einer) Im weiteren vorgehen von mir soll auch gleichzeitig ein Check reinkommen worin überprüft wird ob die E-Mail bereits vorhanden ist oder nicht.

        Sorry, dachte das es sich hier um eine N:M Verbindung handelt sieht man anhand der Zwischentabelle.
        Wieso meinst du, daß diese "Zwischentabelle" notwendig ist? Ich denke, die ist überflüssig, wie fast immer, wenn sie als "Zwischentabelle" bezeichnet wird. Sie soll doch wohl den Sachverhalt ausdrücken, daß bestimmte Leute, die sich anmelden, expertise besitzen, das kann man auch anders speichern, z.B. so wie ich oben schrieb. Ich denke, du hast bei der Modellierung deiner DB ER-Modell und relationales Datenmodell durcheinander geworfen.

        Bitte schicke einen DB-Dump mit realistischen Testdaten. Daß du die jeweils letzte Anmeldung herausfilterst, muß einen Grund haben. Was ist dieser Grund? Welchen Wert hat @var? Ist das ein Bestandteil des Namens der Person, die sich anmeldet? Bitte nochmal: Stelle dar, welchen Vorgang du da abbildest, Welchen Sachverhalt bildet deine "Zwischentabelle" ab?

        Beantworte bitte alle Fragen, ich stelle die nicht aus Langeweile!

        Kommentar


        • #5
          Mal ein MySQL Dump zum erstellen der Tabellen, hier steht wirklich nicht mehr drin.
          Und die Ausgangssituation der Datenbank
          Code:
              "CREATE TABLE IF NOT EXISTS `anmeldungen` (
                  `id` INT NOT NULL AUTO_INCREMENT,
                  `email` VARCHAR(255) NULL,
                  PRIMARY KEY (`id`))
              ENGINE = InnoDB;",
          
              "CREATE TABLE IF NOT EXISTS `expertise` (
                  `id` INT NOT NULL AUTO_INCREMENT,
                  `name` VARCHAR(255) NULL,
                  PRIMARY KEY (`id`))
              ENGINE = InnoDB;",
          
              "CREATE TABLE IF NOT EXISTS `anmeldungen_has_expertise` (
              `anmeldungen_id` INT NOT NULL,
              `expertise_id` INT NOT NULL,
            PRIMARY KEY (`expertise_id`, `anmeldungen_id`),
            INDEX `fk_expertise_has_anmeldungen_anmeldungen1_idx` (`anmeldungen_id` ASC),
            INDEX `fk_expertise_has_anmeldungen_expertise1_idx` (`expertise_id` ASC),
            CONSTRAINT `fk_expertise_has_anmeldungen_expertise1`
              FOREIGN KEY (`expertise_id`)
              REFERENCES `expertise` (`id`)
              ON DELETE NO ACTION
              ON UPDATE NO ACTION,
            CONSTRAINT `fk_expertise_has_anmeldungen_anmeldungen1`
              FOREIGN KEY (`anmeldungen_id`)
              REFERENCES `anmeldungen` (`id`)
              ON DELETE NO ACTION
              ON UPDATE NO ACTION)
          ENGINE = InnoDB;",
          
          INSERT INTO expertise (name) VALUES ("bla1");
          INSERT INTO expertise (name) VALUES ("bla2");
          INSERT INTO expertise (name) VALUES ("bla3");
          INSERT INTO expertise (name) VALUES ("bla4");
          Eine Anmeldung kann mehrere Expertisen haben.
          Eine Expertise kann mehrere Anmeldungen haben.

          Meines wissen ist dies vorraussetzung für eine N:M Verbindung

          Expertisen sind vorgegeben, ich kann sie nicht Hardcoden, aufgrund von Vorgaben, Anmeldungen gibt es in der Ausgangssituation nicht, damit auch keine einträge in der Zwischen Tabelle.
          Eingetragen werden sollen Anmeldungen und seine Expertisen.

          Code:
          DELIMITER $$
          CREATE PROCEDURE `Anmeldungen`(IN `email` varchar(255),IN `var` text)
          BEGIN
          DECLARE eID int(12) DEFAULT 0;
          DECLARE aID int(12) DEFAULT 0;
          
          INSERT INTO anmeldungen (`email`)
          VALUES ('email');
          SET aID = LAST_INSERT_ID();
          
          SELECT id INTO eID
          FROM expertise
          WHERE `name` LIKE '%var%';
          
          INSERT INTO anmeldungen_has_expertise (`anmeldungen_id`, `expertise_id`)
          VALUES (aID,eID);
          
          END$$
          DELIMITER ;
          "var" ist der name der Expertise.

          Ich möchte keine Spalte "has_expertise" einbauen womit ich dann hingehen muss und die Daten via kommata voneinander trennen muss. Anders kann ich mir diese "has_expertise" spalte nicht vorstellen da es wie gesagt eine feste anzahl von expertises gibt und anmeldungen mehr als nur eine expertise haben können.

          Kommentar


          • #6
            Zitat von illmaren Beitrag anzeigen
            ...

            Eine Anmeldung kann mehrere Expertisen haben. ...
            Das hattest du bisher nicht erwähnt.

            "var" ist der name der Expertise.

            Ich möchte keine Spalte "has_expertise" einbauen womit ich dann hingehen muss und die Daten via kommata voneinander trennen muss.
            Das ist nach der Klarstellung von oben auch nicht der richtige Weg.
            Anders kann ich mir diese "has_expertise" spalte nicht vorstellen da es wie gesagt ...
            Wie gesagt, die ist vom Tisch.

            Das hätte man eher klären können, wenn du den Vorgang "real", d.h. nicht technisch-db-mäßig, sondern "wie im richtigen Leben" beschrieben hättest. Wir können hier schließlich nicht hellsehen.

            Was steht denn in dem Feld "name" z.B. drin? (Abgesehen davon, daß ein DB-Spalte niemals "name" heißen sollte, sondern "bezeichnung", "xyz_bez", "Nachname" usw.)

            Nochwas: Kommen die Einträge in anmeldungen nur einmal pro email-adresse rein oder bei jeder "Anmeldung".

            Kommentar


            • #7
              Im Feld "name" steht der Name der Expertise drin.

              SELECT id INTO eID FROM expertise WHERE `name` LIKE '%var%';
              "var" ist der name der Expertise.
              So steht da zb. Physik oder Chemie drin...Fachkenntnisse eben. Als Beispiel werte habe ich oben jedoch Bla1 - Bla4 angegeben da es keinen unterschied macht was nun genau drin steht, die Abfrage ändert sich dadurch doch nicht.

              Zitat von Alf2016 Beitrag anzeigen
              Das hattest du bisher nicht erwähnt.
              Jetzt sollen E-Mail Addressen mit den Werten aus der Expertise Tabelle eingetragen und gleichzeitig durch die zwischentabelle mit einer oder mehrerer expertises verbunden werden.
              und E-Mails sind war im vorrangegangen code in anmeldungen drin...habe es also erwähnt..dachte deswegen soll ich die Struktur posten

              Kommentar


              • #8
                Zitat von illmaren Beitrag anzeigen
                ...

                und E-Mails sind war im vorrangegangen code in anmeldungen drin...habe es also erwähnt..dachte deswegen soll ich die Struktur posten
                Sprech ich chinesisch? Ich fragte:

                Nochwas: Kommen die Einträge in anmeldungen nur einmal pro email-adresse rein oder bei jeder "Anmeldung".
                Sei dir doch bitte darüber im Klaren, daß wir hier nicht deine Situation kennen können. Mit Anmeldung kann sowas wie eine Registrierung gemeint sein, aber auch sowas wie ein Login. Im ersteren Fall steht eine bestimmte Email nur einmal in der Tabelle, im anderen zig Mal.

                Du bist ein bissle betriebsblind - das ist normal und hier meistens so. Aber man kann sich, die Situation, wenn man eine Frage stellt, und die Situation des "Antworters" auch ein wenig reflektieren, oder?!

                Kommentar


                • #9
                  Handelt sich hier nicht um eine Registrierung, E-Mails werden von Nutzern in eine Liste eingetragen

                  In diesem runtergebrochenen vorgehen hier sollen zunächst aus test Gründen, nur folgende Daten eingetragen werden:
                  "E-Mail", "Name der Expertise"

                  Anhand dieser daten wird die "E-Mail" in die Tabelle "anmeldungen" INSERTED, und dann mittels SELECT herrausgefunden welche ID "Name der Expertise" in der Tabelle Expertise hat.

                  Mit den Daten "ID der gerade eingetragenen E-Mail" und "ID der Expertise" wird dann in der Tabelle "anmeldungen_has_expertise" eine verknüpfung zwischen eben diesen Tabellen herrgestellt.
                  Das ist hier gewünscht.


                  Im weiteren vorgehen soll ein E-Mail Check rein der dann überprüft ob die E-Mail bereits vorhanden ist oder nicht, und dann via CASE das weitere vorgehen bestimmt.
                  So soll es am ende dann so sein das eine "E-Mail" in der Tabelle "anmeldungen" über die "anmeldungen_has_expertise" mit mehrere n Expertisen verbunden ist.


                  Hoffe habe jetzt das Betriebsblinde rausgenommen.

                  Kommentar


                  • #10
                    Unter mysql ist die Bestimmung von Insert Values etwas stiefmütterlich gehalten.

                    Code:
                    insert into mytable values(...);
                     select LAST_INSERT_ID();
                    Das würdest Du in einer SP verwenden, aber auch im Client so aufrufen, also mit PHP, wenn Du den Wert brauchst. Mir ist dieser last_insert_id Vorgang immer suspekt. Aber das ist glaub ich meinerseits etwas paranoid. Du kannst trotzdem mal folgende Überlegung anstellen: Was ist, wenn ich für einen gegebenen User (email) eine 2. oder mehr Expertisen eintragen möchte? Der Eintrag der Expertise wäre ein simples insert mit 2 bekannten Parametern. Dein Gedanke mit der SP war schon nicht verkehrt, ist aber nur beim 1. Insert je User notwendig. Mit Last_Insert_ID bekommst Du das bestimmt auch ans laufen. Wenn die DB nicht vorgegeben ist für Deinen Testfall, könntest Du auch andere Systeme nehmen. Normalerweise gibt es dort eine "RETURNING" Clause, die für solche Zwecke eingesezt wird und meist auch mächtiger ist als das mysql Verfahren.

                    Kommentar


                    • #11
                      Diese Gedanken habe ich mir tatsächlich schon gemacht wollte in diesen fall erst weiter arbeiten wenn ich es tatsächlich schaffe werte überhaupt einzutragen.
                      Deswegen auch die abfrage ob die E-Mail schon in der Datenbank ist, so könnte man mehrere möglichkeiten in betracht ziehen, wie zb. das ganze mehrmals ablaufen lassen sollten mehrere expertisen ausgewählt worden sein, so das man dann im Code diese SP einfach nur mehrfach ausführen muss.

                      Mometan verhält es sich so das selbst der eine Eintrag in die anmeldungen_has_expertise Tabelle nicht funktioniert. Momentan denke ich das ich die Variablen nicht richtig fülle oder handhabe...

                      Vorgegeben ist MariaDB

                      Die abfragen von oben werfen den Fehler aus:

                      1452 - Cannot add or update a child row: a foreign key constraint fails (`testen`.`anmeldungen_has_expertise`, CONSTRAINT `fk_expertise_has_anmeldungen_expertise1` FOREIGN KEY (`expertise_id`) REFERENCES `expertise` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)


                      Edit:/ Habe es hinbekommen danke dennoch
                      Das Script von oben hatte nur 1-2 Variable probleme

                      Kommentar


                      • #12
                        Zitat von illmaren Beitrag anzeigen
                        Die abfragen von oben werfen den Fehler aus:

                        1452 - Cannot add or update a child row: a foreign key constraint fails (`testen`.`anmeldungen_has_expertise`, CONSTRAINT `fk_expertise_has_anmeldungen_expertise1` FOREIGN KEY (`expertise_id`) REFERENCES `expertise` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)


                        Edit:/ Habe es hinbekommen danke dennoch
                        Das Script von oben hatte nur 1-2 Variable probleme
                        Prima!

                        Zu den Fehlern:
                        Das kann man in diesem Fall ja wörtlich nehmen und stellt fest: Der Code (Deiner) kann so falsch nicht sein, denn der Fehler kommt von der Datenbank und sagt, "kann ich leider nicht machen (das Insert), weil die mit mir vereinbarten Spielregeln (FK-Constraints) nicht eingehalten werden". Gemeint sind natürlich, die übergebenen Daten verletzen die Regeln.
                        Also eine Constraint Verletzung ist insofern positiv, als man trotz (oder wegen) des Fehlers weiß, dass die Anweisung selbst richtig aufgebaut ist. Nur die Daten machen Schwierigkeiten.

                        Eigentlich ein schönes Beispiel, wie wichtig diese Meldungen sind und dass genaues Lesen hilft, lauffähigen Code zu erstellen.

                        Kommentar

                        Lädt...
                        X