MySql Tabelle aktualisieren

Thomas_Jung

Erfahrenes Mitglied
Hallo ich möchte in der Tabelle "abc_mp3_songs " die "album_id" aktualisieren.
Ist das die schnellste Art oder gibt es noch eine andere Möglichkeit?
Gruß Thomas


PHP:
            $sql = "SELECT song_id, album FROM  abc_mp3_songs  WHERE album_id <1 GROUP BY album";
            $stmt = $pdo->prepare($sql);
            $stmt->execute();
            $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
            $album_id = 1;

            foreach($data as $row){
                
            $sql_2 = "UPDATE `abc_mp3_songs` SET `album_id` = ".$album_id." WHERE `album` = :album";
            $stmt_2= $pdo->prepare($sql_2);
            $stmt_2->bindParam(":album",$row['album'], PDO::PARAM_STR);
            $stmt_2->execute();   
                
            $album_id++;
            
            }
 

Thomas_Jung

Erfahrenes Mitglied
Hi Yaslaw
Ich weis nicht wie ich ohne foreach die $album_id hochzählen soll?

PHP:
"UPDATE `abc_mp3_songs` SET `album_id` = ".($album_id+1)." WHERE
SELECT song_id, album FROM  abc_mp3_songs  WHERE album_id <1 GROUP BY album

Gruß Thomas
 

Zvoni

Erfahrenes Mitglied
Wieso hochzählen?
album_id ist doch ein Fremdschlüssel, also muss es doch den Wert des Primär-Schlüssels aus der Album-Tabelle bekommen, oder?
 

Zvoni

Erfahrenes Mitglied
Huh?
Hätte jetzt den "Klassiker" für Musik erwartet:

Tabelle Artist
ID, Name, blablablabla

Tabelle Album
ID, Artist_ID, Name, Year, blablabla

Tabelle Songs
ID, Album_ID, Artist_ID, Name, Duration, blablabla

Mit Album_ID in Songs einen DEFAULT=Null, falls es ein mp3 ohne Album-Assoziation ist

EDIT: wegen Hochzählen: Hast du schon mal versucht per ROW_NUMBER eindeutige Zeilennummern pro Album zu erhalten?
Weil dann würde es tatsächlich in einem Aufwasch gehen wie Yaslaw schreibt.
Bin mir sogar sicher, dass es geht.
Kannst du mal ein CSV an Beispiel-Daten hier reinhängen?

EDIT2: Übrigens finde ich es seltsam, album als Feld im Song zu haben.
Was machst du, wenn zwei Songs von verschiedenen Bands/Künstlern den gleichen Album-Titel haben?

Beispiel:
Song: "My Song"
Artist: "Band1"
Album: "First Album"

Song: "My Huge Success"
Artist: "Band2"
Album: "First Album"

Ich glaube du siehst wo dein "WHERE album=:album" schief gehen kann
 
Zuletzt bearbeitet:

Thomas_Jung

Erfahrenes Mitglied
Hi Zvoni, hier mal eine csv. :)

Du hast recht dann müste ich noch das Feld `filename_basename` hinzufügen?

PHP:
"UPDATE `abc_mp3_songs` SET `album_id` = ".($album_id+1)." WHERE
SELECT song_id, album FROM  abc_mp3_songs  WHERE album_id <1 GROUP BY album, `filename_basename`


Den Album-Titel wolte ich bei der SELECT Abfrage mit "filename_basename" abfangen

PHP:
SELECT * FROM `abc_mp3_songs` GROUP BY `album`, `filename_basename` ORDER BY `abc_mp3_songs`.`album` ASC
(Zeige alle Alben)


Gruß Thomas
 

Anhänge

  • mp3_csv.csv
    6,9 KB · Aufrufe: 3

Zvoni

Erfahrenes Mitglied
Alter, das CSV ist ja mal wirklich....äähh...schei...... suboptimal....

Ich weiss genau, warum ich das Komma als Trennzeichen hasse wie die Pest in einem CSV.....

Hab jetzt ein wenig hin- und her korrigieren müssen, habs aber importiert bekommen
 

Zvoni

Erfahrenes Mitglied
OK, habs in SQLite gemacht (hab grad keinen MySQL-Server zur Hand)
Musst unter Umständen noch an der Syntax feilen.
Kann @Yaslaw eventuell helfen. Er ist so der MySQL-Spezialist
SQL:
WITH cte(album,filename_basename,RN) As
(SELECT DISTINCT album, filename_basename, ROW_NUMBER() OVER(ORDER BY album ASC) As RN
FROM mp3_csv GROUP BY album,filename_basename)
UPDATE mp3_csv
SET album_id=(SELECT cte.RN FROM cte WHERE mp3_csv.album=cte.album AND mp3_csv.filename_basename=cte.filename_basename)
 
Zuletzt bearbeitet:

Neue Beiträge