代码之家  ›  专栏  ›  技术社区  ›  Dipak

分组方式和分组方式

  •  1
  • Dipak  · 技术社区  · 7 年前

    GROUP_CONCAT() 通常按逻辑调用group并创建临时表,这通常对性能有很大的负面影响。有时您可以添加正确的索引,以避免查询分组中的临时表,但并非所有情况下都如此。

    https://stackoverflow.com/a/26225148/9685125

    看完这篇文章后,我意识到我做错了,因为很多时候我用巨大的 组\u CONCAT() . 例如

    GROUP_CONCAT(DISTINCT exam.title) AS exam,
    GROUP_CONCAT(subject.title, '<br/> Th - ', mark.th, ' | PR - ', mark.pr SEPARATOR ',') AS mark
    

    GROUP_CONCAT 在下列情况下不使用 subquery . 我是说只用 Mysql join ,

    学生

    id  |   Rid |   name
    ========================
    1   |   1   |   john
    

    标志

    id  |   std_id  |   th
    ======================
    1   |   1       |   60
    2   |   1       |   70
    3   |   1       |   80
    4   |   1       |   90
    
    "SELECT 
        student.en_name, mark.th 
        FROM student
        JOIN mark ON student.id = mark.std_id
        WHERE student.id=:id;"
    

    如果只使用 JOIN

    John: 60, John: 70, John: 80, John: 90
    

    GROUP BY 分组依据 至学生id,仅获取第一行

    "SELECT 
        student.en_name, mark.th 
        FROM student
        JOIN mark ON student.id = mark.std_id
        WHERE student.id=:id
        GROUP BY student.id;"
    
    Result is
    John: 60
    

    所以为了得到结果,我们必须分配它 group.concat

    "SELECT 
        student.en_name,
        GROUP_CONCAT(mark.th) as mark 
        FROM student
        JOIN mark ON student.id = mark.std_id
        WHERE student.id=:id
        GROUP BY student.id;"
    

    最后给出了爆炸阵列的预期结果

    $name=$row['en_name'];
    echo "$name: <br/>";
    $mrk_array = explode(',',$row['mark']); 
    foreach($mrk_array as $mark){
        echo $mark.", ";
    }
    
    John:
    60, 70, 80, 90,
    

    在这里,我看不到任何其他的选择 获取每个 Id 组\u CONCAT

    还有一个朋友告诉我

    组\u CONCAT 如果你要“爆炸”它。您不妨返回一个漂亮的关联数组,然后在那里显示它。

    但我不明白,他是什么意思?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Nick SamSmith1986    7 年前

    评论时间太长。。。

    对于原始查询,您实际上返回了一个行数组(关联数组):

    array(array('en_name' => 'John', 'mark' => 60),
          array('en_name' => 'John', 'mark' => 70),
          array('en_name' => 'John', 'mark' => 80),
          array('en_name' => 'John', 'mark' => 90)
         )
    

    GROUP BY GROUP CONCAT ,你是有效的 imploding 这个 'mark' 数组的元素

    array('en_name => 'John', 'mark' => '60,70,80,90')
    

    explode 再次使用数组来处理数据。

    如果您坚持原来的查询,那么您可以在应用程序框架中进行内插。

    $name = "";
    while ($row = $result->fetch()) {
        if ($row['en_name'] != $name) {
            $name = $row['en_name'];
            echo "$name: <br/>" . $row['mark'];
        }
        else {
            echo ',' . $row['mark'];
        }
    }
    

    输出:

    John: 
    60,70,80,90
    

    分组依据 GROUP_CONCAT 在数据库里。

    推荐文章