2017-09-18 1 views
0

J'ai une base de données de livres et d'auteurs, mais la base de données qui m'a été fournie a des doublons avec les auteurs apparaissant plus d'une fois. Je voudrais remplacer le fk_id_author dans la table écrite par le min (id_author) quand il y a des doublons.Comment remplacer les doublons dans PHP/MySQL?

Voici les trois tableaux (simplifiés pour l'exemple):

Auteur

  • id_author

  • author_name

Livre

  • id_book

  • book_name

écrit (auteur peut écrire n livres et un livre peut être écrit par n auteurs)

  • fk_id_book

  • fk_id_author

J'ai fait une demande de trouver des auteurs qui apparaît plus d'une fois dans la table des auteurs avec leurs papiers d'identité et ids des livres qu'ils ont écrits:

SELECT MIN w.fk_id_book, w.fk_id_author, d.author_name, d.nb_written 
FROM Written_by w 
JOIN (SELECT c.id_author, c.author_name, b.nb_written 
FROM Author c 
    JOIN (SELECT MIN(a.id_author), a.author_name, COUNT(a.author_name) 
    nb_written 
     FROM Author a 
     GROUP BY a.author_name 
     HAVING nb_written >1) b 
     ON (c.author_name = b.author_name)  
     ORDER BY c.author_name ASC) d 
    ON w.fk_id_author = d.id_author) 
GROUP BY w.fk_id_author 
ORDER BY d.author_name ASC, w.fk_id_author ASC 

Le résultat est:

fk_id_book ; fk_id_author ; author_name ; nb_written 
80 ; 18 ; Rousseau ; 3 
175 ; 127 ; Rousseau ; 3 
1307 ; 150 ; Rousseau ; 3 
127 ; 302 ; Voltaire ; 2 
1503 ; 927 ; Voltaire ; 2 

Le problème:

Je voudrais obtenir la liste des fk_id_book écrit par un auteur avec le même nom, mais pas le même identifiant sur la même ligne:

list of fk_id_book ; min(fk_id_author) ; author_name ; nb_written 
80,175,1307 ; 18 ; Rousseau ; 3 
127,1503 ; Voltaire ; 2 

Est-il possible dans MySQL?

ensuite avec PHP, je mettrai à jour écrit pour la liste des fk_id_book 80,175,1307 avec fk_id_author 18.

Répondre

0

Ma question était un doublon. Voici la solution:

1 mise à jour le fk_id_author

update written 
join author a1 
on  a1.id_author = written.fk_id_author 
set  written.fk_id_author = 
     (
     select min(a2.id_author) 
     from author a2 
     where a2.author_name = a1.author_name 
    ) 

2 auteurs supprimer sans inscriptions écrites:

DELETE FROM author 
WHERE id_author NOT IN (
    SELECT DISTINCT fk_id_author 
    FROM written 
)