我通常是一名前端开发人员(HTML/CSS 等),但目前我正致力于一些后端开发以应对挑战。请记住,我只做了几周的后端工作,所以我的术语/逻辑还处于起步阶段……放轻松 ;)
作为起点,我正在用 PHP 和 MySQL 构建一个东西,这样我就可以对我的黑胶唱片收藏进行分类。这是一种非常简单的形式,它采用艺术家、标题、标签等并将其存储到 MySQL 数据库中。我还想为每条记录添加标签,这样一首轨道可能会被标记为“House |时髦 | vocal”,而另一个将被标记为“dubstep |主持人 |贝司之类的东西。
我无法将这些标签作为数组存储在 MySQL 中,因此我知道我需要将它们作为逗号分隔值插入,然后当我想在前端级别使用这些标签时,我需要将从数据库中取出 CSV,EXPLODE 该值并将每个元素显示为单独的列表元素。
这部分我明白了。但是我该如何去添加额外的标签呢?我似乎无法找到明确的答案(也许我在搜索错误的东西?)但到目前为止,我所能解决的就是我必须从数据库中获取“标签”的当前数据库值并且将其存储为变量。从数据库中删除“标签”值,将新标签附加到变量,然后将新变量存储回数据库。
当然还有更简单的方法吗?
最佳答案
你应该研究一下关系表和外键的概念。您最好将标签分解成自己的表,如下所示:
专辑表
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 名称由 artists 表中的艺术家 id 替换,标签名称分离到另一个表中,标签名称替换为 tag_ids.. .
请注意 GROUP_CONCAT
是 MySQL 特有的...很确定 SQL SERVER 2005 和更高版本有类似的东西,但我不记得他们怎么调用它。此外 USING (col_name)
是 MySQL 特定的,它只是一种更简单的编写 ON 子句的方法,如 ON a.album_id = b.album_id
并且只能在加入时使用列具有相同的名称。我只是更喜欢 USING
而不是 ON
因为它更短并且使复杂的查询更具可读性。
https://en.wikipedia.org/wiki/Database_normalization
编辑 根据您的评论,如果您将标签分解到它自己的表中,它会是什么样子。我又添加了 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
关于php - 将标签附加到 MySQL 数据库中的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16393541/