MySql Tabelle aktualisieren

Thomas_Jung

Erfahrenes Mitglied
Hi Zvoni,
vielen Dank für deine Zeit und Mühe.
Ich kann leider mit dem SQLite Code überhaupt nichts anfangen.
(Habe mich noch nie mir SQLite beschäftigt)
Vieleicht kann @Yaslaw mal über den Code schauen ob das Sinn macht.
 

Yaslaw

n/a
Moderator
Ich kämpfe noch mit dem vermalideiten CSV. Wenn ich das dann mal irgendwann in meine DB bekomme ohne den PC an die Wand zu schmettern, erkenne ich ev. worum es bei eurer Diskusion überhaubt geht. Ev versuche ich es Morgen oder nächste Woche nochmals.

Hast du schon eine Tabelle in einer MySQL-Instantz? Wenn ja, mach ein Dump (Das erstellt eine CREATE_TABLE und diverse INSERT INTO Statements) und poste diesen. Dann müssen wir uns nicht mit dem CSV-Schrott abärgern.
 

Yaslaw

n/a
Moderator
Nützt mir grad nix. Mit HeidiSql (das einzige SQL-Tool, das ich im Moment grad hab) muss ich erst eine Tabelle erstellen, mit allen Feldern und deren Datentypen. Dazu habe ich schlichtweg kein Bock.
Anschliessend könnte ich das CSV schon einlesen.

Und ja, da ich privat im Moment keine SQL-Projekte am laufen habe, ist mein PC nicht voll von Tools. Das letzte SQL-Projekt ist etwa 5 Jahre her.
 

Zvoni

Erfahrenes Mitglied
Hier als SQL_Dump aus SQLite.
Sollte mit minimalsten Anpassungen funktionieren (Ich glaube Datentyp TEXT musst du mit VARCHAR ersetzen oder sowas)
 

Anhänge

  • mp3_csv.zip
    2,3 KB · Aufrufe: 0

Yaslaw

n/a
Moderator
Also, fangen wir mal an um das Feierabendbier zu verdienen :)

Als erstes analysiere ich mal dein Code. Das folgende SQL hat ein Fehler drin.
Du hast ein GROUP BY. Aber für das Feld song_id hast du nicht weiter definiert was passieren soll. Lass das mal weg
SQL:
SELECT song_id, album
FROM  abc_mp3_songs 
WHERE album_id <1
GROUP BY album;

-- Besser:
SELECT DISTINCT album
FROM  abc_mp3_songs 
WHERE album_id <1;

Erweitern wir das mal um eine Zeilennummer, die auf der höchsten bisherigen ID aufbaut
SQL:
SELECT
      a.album,
      @rownum := @rownum + 1 AS album_id
FROM 
      (SELECT DISTINCT album FROM abc_mp3_songs WHERE album_id = 0) AS a,
      (SELECT @rownum := (SELECT MAX(album_id) FROM abc_mp3_songs)) AS vars;

Und zum Schluss das ganze in ein UPADTE setzen
SQL:
UPDATE
      abc_mp3_songs songs
      INNER JOIN (
            SELECT
                  a.album,
                  @rownum := @rownum + 1 AS album_id
            FROM 
                  (SELECT DISTINCT album FROM abc_mp3_songs WHERE album_id = 0) AS a,
                  (SELECT @rownum := (SELECT MAX(album_id) FROM abc_mp3_songs)) AS vars
      ) AS albums
      ON songs.album = albums.album
SET songs.album_id = albums.album_id;
 
Zuletzt bearbeitet:

Thomas_Jung

Erfahrenes Mitglied
Hallo, Yaslaw,
kannst du mir bitte bei dieser Abfrage vielleicht noch einmal behilflich sein?
Ich möchte die Anzahl der Titel für jedes Album ermitteln und in die Tabelle speichern.
Das klappt zwar, aber es ist glaube ich die schlechteste Lösung. :confused:
Kann ich das auch in einer Abfrage erledigen?

PHP:
    $sql = "SELECT DISTINCT album_id FROM abc_mp3_songs ";
    $statement = $pdo->prepare($sql);
    $statement->execute();
    $num_rows =  $statement->rowCount();
    $data = $statement->fetchAll();
    if ($num_rows > 0 && $data > 0) {       
        foreach($data as $row){     
            
            $sql_2 = "SELECT album_id FROM abc_mp3_songs WHERE album_id = '".$row['album_id']."' ";
            $statement_2 = $pdo->prepare($sql_2);
            $statement_2->execute();
            $num_rows_2 =  $statement_2->rowCount();   
            
            $sql_3 = "UPDATE abc_mp3_songs SET anzahl_mp3 = '".$num_rows_2."' WHERE album_id = '".$row['album_id']."'";
            $statement_3 = $pdo->prepare($sql_3);
            $statement_3->execute();       

        }//foreach($data as $row){
    }

Gruß Thomas
 

Zvoni

Erfahrenes Mitglied
SELECT COUNT(*) FROM abc_mp3_songs WHERE album_id= blabla
kann sogar direkt ins UPDATE gebaut werden