如何在MySQL中通过分隔符( ; )检索存储的数据

How to retrieve stored data by delimiter ( ; ) in MySQL

提问人:waepd urmia 提问时间:11/1/2023 更新时间:11/5/2023 访问量:76

问:

我有 2 张这样的表:

region Table:
+----------+-------------+
|region_id | region_name |
+----------+-------------+
|1         | RN1         |
|2         | RN2         |
|3         | RN3         |
+----------+-------------+

role Table:
+----------+-------------+
|role_id   | role_name   |
+----------+-------------+
|1         | admin       |
|2         | software    |
|3         | network     |
+----------+-------------+

在我的 HTML 表单中,我从管理员那里获得region_id和role_id,并使用 PHP 存储在 MySQL 表中,如下所示:

useraccess Table:
+--------+-----------+
|role_id | region_id |
+--------+-----------+
|1       | 1;2;3     |
|2       | 1         |
|3       | 1;2       |
+--------+-----------+

好吧,问题是我不知道如何编写一个可以使用 useraccess table 从区域表中检索region_name的查询。 例如:当 role_id = 1 时,region_id为 1;2;3 所以我想在我的 HTML 页面中显示 RN1,RN2,RN3,而不是 1,2,3。

我尝试使用PHP使用for循环,但它有自己的局限性并且无法正常工作。我还使用了MySQL SPLIT_STR()函数,但也许我无法获得结果。我将不胜感激帮助我解决这个问题。

php html mysql

评论

5赞 brombeer 11/1/2023
规范化数据
0赞 CBroe 11/1/2023
如果您至少使用逗号而不是分号,那么您可以应用类似 stackoverflow.com/q/19101550/1427878 我想,您仍然可以首先使用字符串函数将分号动态替换为逗号,但这可能会使已经很糟糕的方法变得更糟。如前所述,正确的解决方案是:规范化数据。
0赞 Akina 11/1/2023
当您需要从分隔文本中提取第 N 个元素时,您将使用 .如果 N 大于分隔文本中的值量,则将收到最后一个值。因此,您需要检查值中分隔符的数量。我也同意规范化是唯一安全的解决方案。SUBSTRING_INDEX(SUBSTRING_INDEX(CSV_value, 'delimiter', N), 'delimiter', -1)
0赞 Akina 11/1/2023
@CBroe 该值可能包含内部逗号,FIND_IN_SET将不适用。
0赞 CBroe 11/1/2023
不过,@Akina各个值是此处表中的 ID,因此我怀疑我们实际上必须在任何时候都期望非整数。region

答:

1赞 Hammad Ahmed khan 11/1/2023 #1

您可以使用以下查询:

SELECT ua.role_id,
  GROUP_CONCAT(r.region_name SEPARATOR ',') AS region_names
  FROM useraccess ua
  JOIN region r ON FIND_IN_SET(r.region_id, replace(ua.region_id,";",","))
  GROUP BY ua.role_id;

评论

0赞 waepd urmia 11/1/2023
逗号或分号,这不是问题。我只想显示 RN1,RN2,RN3 而不是 1,2,3(分隔符不重要,或者;
0赞 Hammad Ahmed khan 11/1/2023
@waepdurmia这将显示 RN1,RN2,RN3
0赞 waepd urmia 11/1/2023 #2

此说明效果更好:

SELECT  a.role_id,
    GROUP_CONCAT(b.region_name ORDER BY b.region_id) RegionAccessName
    FROM    useraccess a
    INNER JOIN region b
    ON FIND_IN_SET(b.region_id, a.region_id) > 0
    GROUP   BY a.role_id

但不是返回:

RN1,RN2,RN3
RN1
RN1,RN

返回:

RN1,RN2,RN3
RN1,RN2,RN3
RN1,RN2,RN3

在PHP代码中,我使用这个:

while($row2 = mysqli_fetch_array($result2)){;
    echo $row2["RegionAccessName"];
}
-1赞 Reza Sedagheh 11/5/2023 #3

对于此问题,您需要在两个表之间有一个公共列

评论

0赞 Community 11/6/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。