Mysql如何处理带有多个项目的单行

时间:2018-03-08 19:44:08

标签: mysql sql

我有一个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记录,所以我有点卡在那里已经存在的东西。谢谢您的帮助。

3 个答案:

答案 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