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

标签 php mysql database tags

我通常是一名前端开发人员(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/

相关文章:

php - 连接 phpMyAdmin MySQL 数据库时出现问题

java - JPA/EclipseLink 与 MySQL 的并发问题

php - 使用最后插入的 id 插入时出现问题

database - 免费的地理数据(首都、兴趣点……)数据库

指定 innodb 数据库类型和字符集时出现 MySQL 语法错误

php - 在 PHP 中检查来自 JQuery POST 的 boolean 变量

php - Node JS - 等待完整响应

php - 扩展数据库类以从 MySql 获取结果

mysql - 从 2 个表中选择

mysql - 如何使用ibatis检查更新语句中是否为空?