【问题标题】:mysql array in field join with other table字段中的mysql数组与其他表连接
【发布时间】:2012-07-06 07:38:58
【问题描述】:

我有 2 张桌子:reasonuser

reason (id, reason)
user (id, name, reason_id)

在数据中:

reason (1, 'ok'), (2, 'no problem')
user (1, 'eko', '1,2')

我需要这样的视图:

    id | name | reason
    1  | eko  | ok, no problem

这样做有可能吗?

【问题讨论】:

    标签: mysql join field


    【解决方案1】:

    试试这个解决方案:

    SELECT
        a.id, 
        a.name,
        GROUP_CONCAT(b.reason ORDER BY b.id SEPARATOR ', ') AS reason
    FROM
        user a
    INNER JOIN
        reason b ON SUBSTRING(a.reason, FIND_IN_SET(b.id, a.reason) + (FIND_IN_SET(b.id, a.reason) - 1), 1) = b.id
    GROUP BY
        a.id
    

    作为旁注,您所拥有的是糟糕的数据库设计。 usersreasons 之间的关系是 N:M(多对多)关系。 一个用户可能有很多原因;许多用户可能有一个原因...

    对这种关系建模的最佳方法是使用一个交叉引用表来存储useridreasonid 的唯一组合:

    +-------------+   +-------------------+   +---------------+
    | users       |   | users_has_reasons |   | reasons       |
    +-------------+   +-------------------+   +---------------+
    | userid [PK] |   | userid [PK]       |   | reasonid [PK] |
    | name        |   | reasonid [PK]     |   | reason        |
    | etc...      |   +-------------------+   | etc...        |
    +-------------+                           +---------------+
    

    然后要获得相同的结果,您可以这样做:

    SELECT
        a.userid, 
        a.name,
        GROUP_CONCAT(c.reason ORDER BY c.reasonid SEPARATOR ', ') AS reason
    FROM
        users a
    INNER JOIN
        users_has_reasons b ON a.userid = b.userid
    INNER JOIN 
        reasons c ON b.reasonid = c.reasonid
    GROUP BY
        a.userid
    

    MUCH更高效,因为您的联接将在索引上进行,并且MUCH更易于管理(即插入、更新、删除等)。

    【讨论】:

    • 很抱歉继续我的问题,对我的朋友 zane bien 感到抱歉,因为我的问题还没有完成,在您的代码中只有一行在我的表格中查看,还有其他想法吗?
    • @ElvisSonathaDanListi 您的表中有多少个不同的 id?
    • 之前先道歉,实际上有三个表,分别是 flag_detail、users 和 flag_rules,例如,如果表被填满,它将是:name |图片 |规则 |评论 1 |头像.jpg |好,完美 |好的 2 |头像1.jpg |漂亮,漂亮 |没用过 3 |头像2.jpg |大,滑| 高分辨率照片| CLIPARTO做flag_rules的规则,在rules表内容中:1.good 2. perfect 3. enough 4. pretty 5. big 6. slippery 在flag_detail列只包含'rules'中的规则'id's,比如1.2 3.4等等。我的意思是“规则”1.2 被表 flag_rules 中的现有规则替换
    【解决方案2】:
    select u.id,u.name,r.reason 
    from user u left join reason r 
    on u.reason_id = r.id;
    

    【讨论】:

    • 那行不通。您正在尝试加入不存在的“1,2”
    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和/或文档链接。如果没有围绕它们的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案 - From Review
    猜你喜欢
    • 2014-05-31
    • 1970-01-01
    • 2018-12-17
    • 2019-03-15
    • 2011-12-09
    • 2018-07-22
    • 2012-06-22
    • 2020-08-17
    • 2021-12-21
    相关资源
    最近更新 更多