繁体   English   中英

将标签附加到MySQL数据库中的一行

[英]Appending tags to a row in a MySQL db

我通常是一名前端开发人员(HTML / CSS等),但是目前我正忙于一些后端开发以应对挑战。 请记住,我只做了几周的后端操作,所以我的术语/逻辑还处于起步阶段...放轻松;)

首先,我正在PHP和MySQL中构建一个东西,以便可以对乙烯基集合进行分类。 这是一种非常简单的形式,它可以使用艺术家,标题,标签等并将其存储到MySQL数据库中。 我还想为每条记录实现标签,因此一个曲目可能被标签为“房子| 时髦 vocal”,而另一个将被标记为“ dubstep | MC | 低音或类似的东西。

我无法将这些标签存储为MySQL中的数组,因此我了解我需要将其插入为逗号分隔的值,然后在前端级别使用这些标签时,需要将CSV从中拉出在数据库中,展开该值并将每个元素显示为单独的列表元素。

我理解的那部分。 但是,如何添加其他标签? 我似乎找不到明确的答案(也许我在搜索错误的东西?),但到目前为止,我能解决的是我必须从db中获取当前数据库的“ 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 

您可以进一步将数据分解到Artists表中,在这里,albums_artist名称由artists表中的artist 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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM