我为艺术家建立数据库结构。它们具有一对一的名称,姓氏和其他字段,如下所示:
表名:艺术家
我创建了一个类型表,其中包括艺术家可以执行的4种可能的类型:古典,嘻哈,爵士和其他。
表名:流派
每位艺术家都与流派有一对多的关系:
表名:artist_genres
要显示艺术家播放的流派,请运行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的函数
答案 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策略可能会变得太昂贵;但对于像这样的相对较小的桌子,应该没问题。