Announcement

Collapse
No announcement yet.

Wie muß SQL Abfrage in Mysql formuliert werden ?

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

  • Wie muß SQL Abfrage in Mysql formuliert werden ?

    Hallo allerseits,
    Es geht um folgendes Problem:
    Nach dem "Urknall" gibt es die 2 Atome (Bausteine) 3 und 5
    3, 5
    Die folgende Regel R gibt an, wie aus einer Menge von Bausteinen eine neue Menge entsteht, die die alte Menge enthält:
    Addiere jeweils 2 Atome (die ungleich sein müssen, also nicht 2 gleiche Atome) aus der alten Menge und füge sie später der alten Menge hinzu.
    Beispiel:
    3,5
    Erweiterung1: 8 ergibt:
    3,5, 8
    Erweiterung2: 11, 13 ergibt:
    3,5, 8, 11, 13
    Erweiterung3: 14, 16, 19, 24, 18, 21 ergibt:
    3,5, 8, 11, 13, 14, 16, 19, 24, 18, 21
    ...
    Diese immens wachsenden Zahlen will ich in eine Tabelle einer DB schreiben.
    Mit SQL soll dies wie folgt gehen:
    ================================================
    CREATE TABLE Atoms (Atom BIGINT NOT NULL);
    INSERT INTO Atoms(Atom) VALUES (3),(5);
    WHILE (10000 > (SELECT COUNT(*) FROM Atoms))
    BEGIN
    INSERT INTO Atoms
    SELECT DISTINCT(a1.atom+a2.atom)
    FROM Atoms a1
    INNER JOIN Atoms a2 ON a1.atom != a2.atom
    WHERE NOT EXISTS (SELECT atom FROM Atoms a3 WHERE a3.atom = (a1.atom + a2.atom))
    ================================================

    Frage:
    Wie macht man dies mit Mysql ?

    mfg
    Bh

  • #2
    Per reinem SQL ist das nicht möglich.

    Du brauchst eine Procedure, die die Iteration macht, zumindest unter mysql nicht - glaub ich.

    Code:
    -- Procedure erzeugen in der sql console
    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS insert_atom_n $$
    
    CREATE PROCEDURE insert_atom_n (p_n integer) 
        BEGIN
            DECLARE cnt INT DEFAULT 0;
    
            WHILE cnt < p_n DO
                -- Dein Statement hier eintragen
                
                -- dann counter hochzählen
                SET cnt = cnt + 1;
            END WHILE;
        END $$
    
    DELIMITER ;
    
    
    -- Aufruf in der sql console (ausgehend davon, dass die Tabelle initialisiert ist, also in irgendeiner Form mit Werten befüllt ist)
    call insert_atom_n (5);
    Beachten, dass 1 Iteration je nach bereits vorhandenen Datensätzen enorme Datenmengen produzieren kann.
    N = Anzahl der Wiederholungen (nicht Anzahl der Datensätze)

    Und
    Tabellen nennt man traditionell gerne im Singular.
    Ein Index dürfte es etwas beschleunigen.
    Oder statt extra Index die Atom Spalte direkt als Primary Key anlegen.
    Gruß, defo

    Comment


    • #3
      Hallo defo,
      Danke für deine Hilfe.

      mfg
      Bh

      Comment


      • #4
        Da stellt sich mir die Fragen, warum nicht im Arbeitsspeicher berechnen und dann in einer Datenbank abspeichern? Scheint mir ein leicht falsches Design zu sein

        Comment


        • #5
          Originally posted by fanderlf View Post
          Da stellt sich mir die Fragen, ..? Scheint mir ein leicht falsches Design zu sein
          Was ist denn falsch? Und was ist richtig?
          Wie leistungsfähig sind die beiden Varianten?
          Wie hoch ist der Implementierungsaufwand und das notwendige Know How?
          Gruß, defo

          Comment

          Working...
          X