我有一个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
ole
也许有更好的方法可以做到这一点,但CSV文件有25k记录,所以我有点卡在那里已经存在的东西。谢谢您的帮助。
答案 0 :(得分: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小提琴。
或者,处理这个问题的方法较短:
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小提琴。
答案 1 :(得分:0)
我使用SQL Server 2014,不幸的是,我无法使用这些功能,但这个问题与我发现here非常相似。
答案 2 :(得分:0)
好的,我想出了如何做一个嵌套循环来完成这个。
while ($row = mysqli_fetch_array($result)) {
// echo“Im”in the Loop“; 回声''。 $ row ['First_Name']。 '';
echo '<td width="70">' . $row['Middle_Initial'] . '</td>';
echo '<td width="70">' . $row['Last_Name'] . '</td>';
echo '<td width="70">' . $row['External_ID'] . '</td>';
//Output all groups with loop
$str = $row['Groups'];
$wordChunks = explode("|", $str);
echo '<td width="10">';
for($i = 0; $i < count($wordChunks); $i++){
echo "$wordChunks[$i]" . '<br />';
}
'</td>';
echo '<td width="70">' . $row['User_ID'] . '</td>';
echo '<tr>';
} // End of Loop