连接三个表以获得标记列表

fcwjkofz  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(316)

我有三张table:

用户提交的值

id | owner_id | value |
  -----------------------
   1 | 1        |  1337 |
   2 | 2        |  1337 |
   3 | 2        |  1337 |
   4 | 1        |  1337 |

标签

id | owner_id |      text |
  ---------------------------
   1 | 1        |  'Tag 01' |
   2 | 1        |  'Tag 02' |
   3 | 1        |  'Tag 03' |
   4 | 2        |  'Tag 04' |

用户提交的值标签

id | owner_id | tag_id | value_id |
  -----------------------------------
   1 | 1        |      1 |        1 |
   2 | 1        |      2 |        1 |
   3 | 1        |      3 |        1 |

所以基本上,用户可以提交值并输入任意数量的freetext标记来附加到该值。我需要将标签存储为属于特定用户的标签,并且我需要能够计算他们使用每个标签的次数。
我要完成的是从 user_submitted_value 加上标签。例如:

Query value with id 1:

  id | owner_id | value |                         tags |
  ------------------------------------------------------
   1 | 1        |  1337 | "'Tag 01','Tag 02','Tag 03'" |

  Query all values belonging to user with id 1:

  id | owner_id | value |                         tags |
  ------------------------------------------------------
   1 | 1        |  1337 | "'Tag 01','Tag 02','Tag 03'" |
   4 | 1        |  1337 |                           "" |

不知何故,我知道我需要加入一次或多次,但我对sql还不太熟悉,不知道该怎么做。

ddhy6vgd

ddhy6vgd1#

这是我的最终解决方案。很大程度上基于戈登·林诺夫提交的答案。

SELECT
        user_submitted_value.id,
        user_submitted_value.creator_id,
        user_submitted_value.value,
        group_concat(tag.text) AS tags
      FROM user_submitted_value
      LEFT JOIN user_submitted_value_tag
        ON user_submitted_value.id = user_submitted_value_tag.value_id
        AND user_submitted_value.creator_id = user_submitted_value_tag.creator_id
      LEFT JOIN tag
        ON user_submitted_valuetag.tag_id = tag.id
        AND user_submitted_value_tag.creator_id = tag.creator_id
        WHERE user_submitted_value.id = ?
      GROUP BY user_submitted_value.id

这个 WHERE 第二条 JOIN 可以修改以获取给定用户的所有值。

qnzebej0

qnzebej02#

这似乎是一种相当神秘的数据格式——特别是因为 owner_id 在所有表格中重复。
在任何情况下,我认为要获取给定用户的值和标记的基本查询如下所示:

select usv.owner_id,
       group_concat(distinct usvt.value_id) as values,
       group_concat(distinct t.text) as tags
from user_submitted_value usv join
     user_submitted_value_tag usvt
     on usv.value_id = usvt.value_id and usv.owner_id = usvt.owner_id join
     tags t
     on usvt.tag_id = t.id and usvt.owner_id = t.owner_id
group by usv_owner_id;

相关问题