我通常是一个前端开发人员(HTML/CSS等),但目前我被一些后端开发的挑战。请记住,我只做了几个星期的后端事情,所以我的术语/逻辑还处于起步阶段……放轻松;)
作为起点,我正在用PHP构建一个东西&MySQL这样我就可以整理我的黑胶唱片了。这是一个非常简单的表单,将艺术家,标题,标签等存储到MySQL数据库中。我还想为每个记录实现标签,因此一个轨道可能被标记为"House | funky | vocal",而另一个轨道将被标记为"dubstep | MC | Bass"或类似的东西。
我不能将这些标签存储为MySQL中的数组,所以我明白我需要将它们插入为逗号分隔的值,然后当我想在前端级别使用这些时,我需要将CSV从数据库中取出,explosion该值并将每个元素显示为单独的列表元素。
那部分我明白。但是如何添加额外的标签呢?我似乎找不到一个明确的答案(也许我在搜索错误的东西?),但到目前为止,我所能解决的是,我必须从数据库中获取"标签"的当前数据库值,并将其存储为变量。从数据库中删除'tags'值,给变量添加一个新标记,然后将新变量存储回数据库中。
肯定有更简单的方法吧?
您应该学习关系表和外键的概念。您最好将标签分解到它自己的表中,像这样:
专辑表
album_id album_artist album_title --------------------------------------------------- 1 Nirvana In Utero 2 Noisia Split the Atom
标签表
album_id tag -------------------------------------------------- 1 Rock 1 Grunge 1 Alternative 2 Dubstep 2 Drum & Bass 2 Experimental
然后可以使用GROUP CONCAT
将它们连接回逗号分隔的列表中SELECT a.album_artist
,a.album_title
,GROUP_CONCAT(b.tag) AS tags
FROM Album a
JOIN Tags b
USING (album_id)
WHERE album_id = xxx
结果:
album_artist album_title tags --------------------------------------------------- Nirvana In Utero Rock, Grunge, Alternative Noisia Split the Atom Dubstep, Drum & Bass, Experimental
您可以进一步将数据分解为艺术家表,其中album_artist名称替换为艺术家表中的艺术家id,标签名称分离到另一个表中,标签名称替换为tag_ids…
注意GROUP_CONCAT
是特定于MySQL的…很确定SQL SERVER 2005和之后的版本有类似的东西,但我不记得他们叫它什么了。另外,USING (col_name)
是MySQL特有的,它只是像ON a.album_id = b.album_id
一样编写ON子句的一种更简单的方式,并且只能在连接列具有相同名称时使用。我只是喜欢USING
ON
,因为它更短,使复杂的查询更可读。
编辑根据你的评论,如果你把标签分解到它自己的表中,这就是它的样子。我增加了2个条目来显示值的重复-注意Rock, Dubstep和Experimental如何被使用超过1次,但它们的文本值只列出一次…
查询:Album table: album_id album_artist album_title --------------------------------------------------- 1 Nirvana In Utero 2 Noisia Split the Atom 3 Nero Welcome Reality 4 Pink Floyd The Wall Tags table: tag_id tag -------------------------------------------------- 1 Rock 2 Grunge 3 Alternative 4 Dubstep 5 Drum & Bass 6 Experimental Album_Tags table: album_id tag_id -------------------------------------------------- 1 1 1 2 1 3 2 4 2 5 2 6 3 4 4 1 4 6
SELECT a.album_artist
,a.album_title
GROUP CONCAT(c.tag) AS tags
FROM Album a
JOIN Tags b
USING (album_id)
JOIN Album_Tags c
USING (tag_id)
WHERE album_id = xxx
ORDER BY album_title ASC
结果:
album_artist album_title tags --------------------------------------------------- Nirvana In Utero Rock, Grunge, Alternative Noisia Split the Atom Dubstep, Drum & Bass, Experimental Pink Floyd The Wall Rock, Experimental Nero Welcome Reality Dubstep