【问题标题】:Is it possible to have a MySQL column containing multiple values as foreign keys?是否可以有一个包含多个值作为外键的 MySQL 列?
【发布时间】:2013-07-29 14:49:18
【问题描述】:

我正在学习 MySQL,并在 Fedora 19 中安装了 MariaDB。

我有一个场景,我需要一个列包含多个值,以减少列分配的可能冗余。

在下面的示例中,是否可以让log 表的tags 列中的每个值引用tags 表中的tag_id 列?

用户

user_id        |
1              |

活动

activitity_id  |
1

日志

user_id        |    activity_id    | tags
1              |    1              | 1,3,5 # multiple foreign keys?  

标签

tag_id         |
1              |
2              |
3              |
4              |
5              |

如果不可能,谁能提供基于上述数据场景的最可行解决方案的逻辑?

类似问题:

Are multiple foreign keys in a single field possible?

MySQL foreign key having multiple (conditional) possible values

it is possible to reference one column as multiple foreign keys

【问题讨论】:

    标签: mysql foreign-keys mariadb


    【解决方案1】:

    如果您不想组成一个“中间人”表来链接两个表,您可以在字段中使用逗号分隔值,您只需要在查询时使用find_in_set mysql 函数

    使用 find_in_set

    SELECT
       log.user_id, log.activity_id, log.tags,
       GROUP_CONCAT(tags.name) as taggedNames //This assumes there is a field called `name` in tags table
    FROM
       log
    LEFT JOIN tags
    ON
       FIND_IN_SET(tags.tag_id,log.tags)
    GROUP BY
       log.activity_id
    

    GROUP_CONCAT 将一个字段组合在一起并用分隔符分隔它们,默认为,

    【讨论】:

    • ERROR 1054 (42S22): Unknown column 'log.user_id' in 'field list'
    • @user1063287 忘记将log 表添加到FROM 子句
    • Empty set (0.01 sec) - 我需要在上述查询中添加更多定义吗? log.tags中记录1的内容是'1,2'(VARCHAR(30))。
    • 可能是您需要左连接,(编辑后的答案显示),我的服务器已关闭,所以我无法正确测试
    • 是的,如果您想订购它们,您将不得不对标签名称进行订购。但是在主行的某些部分像order by log.activity_id, tags.name 或类似的顺序那样做,否则如果你只是通过tags.name 做的话,日志结果可能是无序的
    猜你喜欢
    • 2023-03-30
    • 2012-01-03
    • 2016-04-17
    • 2023-03-31
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2020-12-14
    • 2020-07-21
    相关资源
    最近更新 更多