MySql Abfrage schneller machen!

Thomas_Jung

Erfahrenes Mitglied
Hallo,
folgendes Script macht genau das, was ich möchte.

Kann man diese Abfragen kombinieren, verbessern oder schnellen machen

PHP:
/*****
Einzelne Firmen aus weilhammer_datenbank ziehen
***/

        $sql = "SELECT DISTINCT firma FROM `weilhammer_datenbank` ";
        $statement = $pdo->prepare($sql);
        $statement->execute();
        $num_rows =  $statement->rowCount();       
        $data = $statement->fetchAll();
        foreach ($data as $row){
            
            $firma = $row['firma'];

            $sql_drop = "DROP TABLE IF EXISTS `firma_$firma`;";
            //echo $sql_drop.'<br />';
            //$statement_drop = $pdo->prepare($sql_drop);
            //$statement_drop->execute();

            $sql_drop = "TRUNCATE TABLE `firma_$firma`;";
            //echo $sql_drop.'<br />';
            $statement_drop = $pdo->prepare($sql_drop);
            $statement_drop->execute();

    
/*****
Einzelne Tabellen für jede Firma erstellen
***/
            
            $sql_create = "CREATE TABLE IF NOT EXISTS `firma_$firma` (
                        `id` int NOT NULL AUTO_INCREMENT,
                        `firma` int(6) NOT NULL,
                        `bezeichnung` varchar(255) NULL,
                        PRIMARY KEY (`id`));";
            //echo $sql_create.'<br />';
            $statement_create = $pdo->prepare($sql_create);
            $statement_create->execute();   

/*****
Einzelne Tabelle für jede Firma mit Daten befüllen
***/

            $sql_select = "SELECT firma, bezeichnung FROM `weilhammer_datenbank` WHERE firma = $firma";
            //echo $sql_select.'<br />';
            $statement_select = $pdo->prepare($sql_select);
            $statement_select->execute();
            $data_select = $statement_select->fetchAll();                     
            
            foreach ($data_select as $row_select){
            
            $sql_insert = "INSERT INTO `firma_$firma` (`id`, `firma`, `bezeichnung`) VALUES (NULL, :firma, :bezeichnung);";
            //echo $sql_insert.$row_select['firma'].'<br />';
            $statement_insert = $pdo->prepare($sql_insert);
            $statement_insert->bindParam(':firma', $row_select['firma']);
            $statement_insert->bindParam(':bezeichnung', $row_select['bezeichnung']);
            $statement_insert->execute();
                
            }

        }

Gruß Thomas
 
#bdt600
Weil es verlangt wird :rolleyes:

Jetzt fehlt mir nur noch eine Schleife vom DISTINCT um die jeweilige Firma auszugeben.

Code:
INSERT INTO firma_2 (id, firma, bezeichnung)
SELECT id, firma, bezeichnung
FROM weilhammer_datenbank
WHERE firma = 2;
 
1) DROP ist Tabelle löschen, TRUNCATE TABLE ist Tabelle leeren. Auf Zeile 14 hast du ein DROP Statement, das nie ausgeführt wird. Sowas ist verwirrend.

2) Ja, so win DB-Design sollte verhindert werden.

Ansonsten hast du ja dein beschleunigtes INSERT...SELECT bereits selber gefunden
 
DROP und TRUNCATE war nur zu Testzwecken.

Eigentlich geht es nur darum, eigene Tabellen pro Firma aus der Tabelle weilhammer_datenbank zu generieren.
 
Unabhängig davon, dass die anderen recht haben, dass so ein Design Mist ist:
MySQL unterstützt Dynamic SQL in Stored Procedures
MySQL - Dynamic SQL with EXECUTE and PREPARE Statements - SQL Authority with Pinal Dave

EDIT: Du kannst auch ein Create Table From Select machen
Ungetestet
PHP:
$sql_create = "CREATE TABLE IF NOT EXISTS `firma_$firma` (
`id` int NOT NULL AUTO_INCREMENT,
`firma` int(6) NOT NULL,
`bezeichnung` varchar(255) NULL,
PRIMARY KEY (`id`)) 
AS
SELECT `firma`, `bezeichnung` FROM `weilhammer_datenbank` 
WHERE `firma`=$firma;"
 
Zuletzt bearbeitet:
Pass auf mit generierten Tabellennamen. Niemals niemals irgendwelche Texte (möglicherweise auch noch von Benutzern) als Tabellennamen einbauen.
Abgesehen von möglicher SQL-Injection hast du z.Bsp. mit Umlauten die tollsten Effekte, bis hin zu nicht mehr ansprechbaren Tabellen, weil das Namensmapping nicht mitmacht.
 

Neue Beiträge

Zurück