【问题标题】:Count number of users for the comma separated values计算逗号分隔值的用户数
【发布时间】:2015-05-14 07:23:05
【问题描述】:

我的数据库中有逗号分隔的字段base_users。如何查询以计算该组的totaluser?如果数据不在逗号分隔的字段中,我计算totaluser 没有问题。

SELECT COUNT(base_u_id) AS totaluser 
FROM base_users 
WHERE base_u_group =".$row['base_gp_id']."
1)base_users |base_u_id | base_u_name | base_u_group | ------------------------------------------ | 1 |用户名1 | 1, 2, 4 | | 2 |用户名2 | 3 | | 3 |用户名3 | 3, 4 | | 4 |用户名4 | 1, 4 | 2)base_groups | base_gp_id | base_gp_name | ------------------------------ | 1 |组1 | | 2 |组2 | | 3 |组3 | | 4 |组4 | | 5 |组5 |

从上面的示例数据库中,我的预期结果将是:

Total User of group1 = 2
Total User of group2 = 1
Total User of group3 = 2
Total User of group4 = 3
Total User of group5 = 0

这是我迄今为止尝试过的:

<?php
$getUser = base_executeSQL("SELECT * FROM base_users");

while($row_getUser = base_fetch_array($getUser))
{
    $explodeData = explode(", ",$row_getUser['base_u_group']);
    foreach($explodeData as $data)
    {
        $getUserGroupSQL = base_executeSQL("SELECT COUNT(base_u_id) AS totaluser FROM base_users as user, base_groups as gp WHERE gp.base_gp_id ='".$data."' ");

        while($UserGroupProfile_row = base_fetch_array($getUserGroupSQL))
        if (base_num_rows($getUserGroupSQL)!= 0)
            $totaluser = $UserGroupProfile_row["totaluser"];
        elseif (base_num_rows($getUserGroupSQL)== 0)
            $totaluser = 0;
    }
}
?>

【问题讨论】:

  • 总数就是逗号的个数+1(或者带逗号的字符串长度与不带逗号的字符串长度之差+1)。现在看看标准化
  • 更好地修复损坏的数据库设计。它需要规范化
  • @Strawberry 我找到了this。你是这个意思吗?
  • 可能,但我误解了这个问题。唯一明智的解决方案是规范化(或者忘记使用 SQL)。

标签: php mysql


【解决方案1】:

使用以下逻辑:只是提示

$group = array(1=>0,2=>0,3=>0,4=>0,5=>0);
$base_u_group = array('1,2,4','3','3,4','1,4');
foreach($base_u_group as $gr) {
       $split = explode(',', $gr);
       if (!empty($split)) {
          foreach($split as $val) {
            if ($val) {
              $group[$val] =  $group[$val] + 1;
            }
          }
       }
}
var_dump($group);

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT COUNT(u.base_u_id), g.base_gp_name FROM base_users u
    INNER JOIN base_groups g ON IF(POSITION(',' IN u.base_u_group) > 0, u.base_u_group LIKE ('".$row['base_gp_id'].",%') OR u.base_u_group LIKE ('%, ".$row['base_gp_id'].",%') OR u.base_u_group LIKE ('%, ".$row['base_gp_id']."'), u.base_u_group = '".$row['base_gp_id']."')
    WHERE g.base_gp_id = ".$row['base_gp_id']."
    

    【讨论】:

    • 这对我不起作用。它仅包含 1 个用户。
    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多