J'ai quatre tables (file d'attente, chansons, titres, chansons_titles) qui sont liées les unes aux autres et je dois supprimer les doublons qui se produisent dans la table des files d'attente.

La structure de la table de file d'attente est:

ID (primary key)
songID (foreign key from song table)
sortID

La table des titres a une structure telle que:

ID (primary key)
title
author
lyrics

La table Songs_Titles est structurée comme suit:

songID (foreign key from song table)
titlesID (foreign key from titles table)
info

La table Song a un certain nombre de champs, mais inclut un champ ID qui est référencé dans les tables de files d'attente et la table Songs_titles.

Comment puis-je supprimer les enregistrements en double de la table de files d'attente contenant des enregistrements de chanson contenant le même titre?

Voici un exemple de données renvoyées par cette instruction SQL à partir de la table de file d'attente.

SELECT * FROM queue;

ID    songID    sortID
7021    9722    8000
7018    5971    6000
7017    5953    10000
7016    10145   4000
7020    16469   14000

La table de file d'attente a des titres en double que je dois supprimer de la table. J'ai essayé d'utiliser cette instruction SQL. Il affiche le titre en double sur "Zion Hears the Watchmen’s Voices" mais le "Away in a Manger" n’est pas un doublon, mais l’instruction SQL le duplique dans l’instruction return.

SELECT ti.title AS TitlesTableTitle, 
          q.songID AS SongsTableID, 
          q.ID AS QueueTableID
    FROM queue q
    INNER JOIN songs_titles st ON q.songID = st.songID
    INNER JOIN titles ti ON st.titlesID = ti.ID;

TitlesTableTitle                       SongsTableID   QueueTableID
Away in a Manger                        9722           7021
Away in a Manger                        9722           7021
O Come, Little Children                 9722           7021
Zion Hears the Watchmen’s Voices        5971           7018
Hush, My Dear, Lie Still and Slumber    5953           7017
Gentle Mary Laid Her Child              10145          7016
Zion Hears the Watchmen’s Voices        16469          7020
0
user5919866 25 août 2020 à 23:57

2 réponses

Meilleure réponse

J'ai trouvé une solution à mon problème en utilisant ce SQL. Il localise les enregistrements dans la table de files d'attente qui ont des titres en double, puis supprime le doublon ayant l'ID le plus élevé.

DELETE FROM 
  queue
WHERE 
  ID IN (
    SELECT 
      MAX(ID) 
    FROM 
      (
        SELECT 
          DISTINCT(t1.ID), 
          t1.title 
        FROM 
          (
            SELECT 
              ti.title, 
              q.songID, 
              q.ID 
            FROM 
              queue q 
              JOIN titles ti ON EXISTS (
                SELECT 
                  * 
                FROM 
                  songs_titles st 
                WHERE 
                  q.songID = st.songlistID 
                  AND st.titlesID = ti.ID
              )
          ) t1
      ) t2 
    GROUP BY 
      t2.title 
    HAVING 
      COUNT(t2.title) > 1
  );
0
user5919866 26 août 2020 à 15:05

Extrayez la table de pont de la requête principale (vous n'en sélectionnez aucune colonne)


SELECT ti.title AS TitlesTableTitle 
        , q.songID AS SongsTableID
        , q.ID AS QueueTableID
 FROM queue q
 JOIN titles ti ON EXISTS (
        SELECT * 
        FROM songs_titles st
        WHERE q.songID = st.songID
        AND st.titlesID = ti.ID
        );
0
wildplasser 26 août 2020 à 13:21