Mysql如何处理包含多个项目的单行

Posted

技术标签:

【中文标题】Mysql如何处理包含多个项目的单行【英文标题】:Mysql how to handle a single row with multiple items 【发布时间】:2018-03-08 19:44:07 【问题描述】:

我有一个已导入数据库的 excel CSV 文件。有一个称为组的字段,其中包括特定人员所属的所有组。这些组由 | 分隔。 (管道)字符。我想为每个搜索该组的人运行此字段以查看他们是否属于但我很难弄清楚如何创建一个循环来阅读所有这些人。

表格示例

------------------------------------ 
|Name   |      Groups               |
------------------------------------
|Bob    | Cleaning|Plumber          |
|Sue    | Admin|Secretary|Pay_role  |
|Joe    | Engineer                  |
|Frank  | Plumber|Admin             |
|James  | Plumber|Carpenter         |

我想出了如何在 | 之前抓住第一组但我不知道之后如何阅读每个字段

SELECT substring(Groups,1,((instr(Groups,'|')-1))) as ExtractString 

来自 DB_groups

将来我想将人员添加到组并从组中删除人员,因此我正在寻找一个查询,可以让我看到每个人的组,例如:

Sue | Admin
Sue | Secretary
Sue | Pay_r

奥莱

也许有更好的方法可以做到这一点,但 CSV 文件有 25k 条记录,所以我有点卡在里面已经存在的内容上。谢谢您的帮助。

【问题讨论】:

首先规范化你的架构。 【参考方案1】:

SQL 中的一个方法是这样的:

select name, substring_index(groups, '|', 1)
from t
union all
select name, substring_index(substring_index(groups, '|', 2), '|', -1)
from t
where groups like '%|%'
union all
select name, substring_index(substring_index(groups, '|', 3), '|', -1)
from t
where groups like '%|%|%'
union all
select name, substring_index(substring_index(groups, '|', 4), '|', -1)
from t
where groups like '%|%|%|%';

这适用于最多四个长度的列表,但它可以轻松扩展到更多。

Here 是此方法的 SQL Fiddle。

或者,一种更短的处理方式:

select name, substring_index(substring_index(groups, '|', n.n), '|', -1) as grp
from t cross join
     (select 1 as n union all select 2 union all select 3 union all select 4
     ) n
where n.n >= (length(groups) - length(replace(groups, '|', '')))

要添加更多组,只需增加n 的大小即可。

Here 是此版本的 SQL Fiddle。

【讨论】:

第一个查询只给了我 substring_index(groups, '|', 1) 字段,而没有其他任何字段。我可以将查询分开并获取其他部分,但我似乎无法将其组合起来。第二个查询不运行。我把 n 换成了数字,但我很困惑它是否应该是 4.4,它有一个 n.n @TC 。 . .你确定分隔符是竖线吗? @TC 。 . .第一个版本运行良好。我修复了第二个版本并为两者添加了 SQL Fiddles。 是的,分隔符是竖线。我可以搜索它,它会提取我期望的所有结果。 好的,我保留了 n.n 值的查询,并没有将其切换为数字,现在它运行得更好,但我仍然缺少 | 之前的第一组所以我正在努力找出原因【参考方案2】:

我使用 SQL Server 2014,所以很遗憾,我无法使用这些功能,但这个问题与我发现的 here 非常相似。

【讨论】:

【参考方案3】:

好的,我想出了如何做一个嵌套循环来完成这个。

while ($row = mysqli_fetch_array($result)) 

//echo "我在循环中"; 回声''。 $row['First_Name'] 。 '';

echo    '<td >' . $row['Middle_Initial'] . '</td>';

echo    '<td >' . $row['Last_Name'] . '</td>';

echo    '<td >' . $row['External_ID'] . '</td>';

//Output all groups with loop
$str = $row['Groups'];
$wordChunks = explode("|", $str);
echo    '<td >';
for($i = 0; $i < count($wordChunks); $i++)
 echo "$wordChunks[$i]" . '<br />';

'</td>';

echo    '<td >' . $row['User_ID'] . '</td>';

echo '<tr>';    
 // End of Loop

【讨论】:

以上是关于Mysql如何处理包含多个项目的单行的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 ListView 中的多个倒数计时器?

如何处理完成闭包中的多个错误

您如何处理多个环境的多个 web.config 文件?

XCode 如何处理带有多个目标的#import 标头语句?

多个tableview单元格内的Collectionview,如何处理选择?

如何处理数据库崩溃(Glassfish/MySQL)?