如何更新一对多关系的用户个人资料数据?

时间:2017-03-01 22:54:02

标签: php mysql

我为艺术家建立数据库结构。它们具有一对一的名称,姓氏和其他字段,如下所示:

表名:艺术家

enter image description here

我创建了一个类型表,其中包括艺术家可以执行的4种可能的类型:古典,嘻哈,爵士和其他。

表名:流派

enter image description here

每位艺术家都与流派有一对多的关系:

表名:artist_genres

enter image description here

要显示艺术家播放的流派,请运行sql命令:

$sql = "SELECT genre_id FROM artists JOIN artist_genres ON artists.id=artist_genres.artist_id";
$result = $database->query($sql);

  $newsql = "SELECT genre_name FROM genres WHERE id = $result"; //This is incorrect, but that's the logic
  $genrenames = $database-> query($newsql);

现在我感兴趣的是如何更新流派,当用户说决定从RAP和其他转换为Classical和Jazz时。我无法想到一个简单的方法,我的所有尝试都会变得非常复杂。

我首先尝试检查artist_genres表中是否已存在artist_id。如果是这样,我要么根据用户的选择运行do_nothing(),删除(从类型中取消订阅)或插入(订阅)。我在想一个使用if的函数(isset(artist_id AND genre_id),DELETE()else INSERT))

我目前正在使用FORM复选框为流派提供值。这有效吗?

更新 我试图以面向对象的方式来做这件事。我创建了一个名为Artistgenre的对象,其中包含基于artist_id选择genre_id的函数

1 个答案:

答案 0 :(得分:1)

使用这种方法,使用参数化查询会有点复杂(它们不直接采用列表);但你可以在两个查询中完成它。

DELETE 
FROM artist_genres 
WHERE artist_id = X 
   AND genre_id NOT IN ([current_list])
;

INSERT INTO artist_genres (artist_id, genre_id)
SELECT X, genre_id
FROM genres
WHERE genre_id IN ([current_list])
   AND genre_id NOT IN (
              SELECT genre_id 
              FROM artist_genres 
              WHERE artist_id = X
              )
;

第一个查询删除列表中不再存在的关联,第二个查询关联列表中尚未关联的类型。

注意:如果类型是一个非常大的表(可疑),INSERT ... SELECT策略可能会变得太昂贵;但对于像这样的相对较小的桌子,应该没问题。