获取不同的列值以及其他列中具有相同名称的所有值

时间:2017-07-24 17:59:20

标签: php

我这里有这张表

         name_relation       
[   id       name     age     head   ] 
[    1        X1       12       X    ] 
[    2        X2       22       X    ] 
[    3        X3       54       X    ] 
[    4        Y1       4        Y    ]
[    5        Y2       8        Y    ]
[    6        Y3       10       Y    ] 

我想要得到的是以下

X: X1X2X3
Y: Y1Y2Y3

所以我做了这个循环

$pre = null;
$ed = "";
while($row = $stmt->fetch()){
    $name = $row['name'];
    $head = $row['head'];

    if ($head != $pre) {
        echo $ed;
        echo "<div>";
        echo "$head:";
    }
    $ed = "</div>";
    $pre = $head;
    echo $name;
}
echo $ed;
echo "</div>";

在一个空白的页面上它运行得很完美,但当我把它与其他代码结构放在一起时,我发现Web浏览器正在填充并自动修复它,但现在我在循环结束时得到了额外的</div> ,我怎么能解决这个循环成为

<div>
   X:X1X2X3
</div>
<div>
   Y:Y1Y2Y3
</div>

1 个答案:

答案 0 :(得分:2)

虽然使用PHP实现所需结果并不困难,但使用适当的查询可以在数据库中更轻松地解决问题。

试试这个:

SELECT head, GROUP_CONCAT(name SEPARATOR '') AS all_names
FROM tbl
GROUP BY head

tbl替换为您的实际表名。您可能还希望按特定顺序获得结果。为此添加ORDER BY head

PHP代码现在变为:

while ($row = $stmt->fetch()) {
    echo("<div>{$row['head']}:{$row['all_names']}</div>");
}

这就是全部。

仅限PHP的解决方案是跟踪head的当前值, 当</div>的值更改但不在第一行之前输出结束标记head,当值{{1}时输出开始标记<div> }} 变化。此外,只显示一次head的值,当它发生变化时,会显示每行head的值。不要忘记在循环结束后输出结束标记`但是只有至少迭代一次(查询返回了一些内容)。

这听起来很难,但实际上很容易:

name

在上面的代码中,您可以使用一些&#34; magic&#34;而不是// The current value of $['head'] // We assume here NULL is not a valid value for it in the database // If it happens that you have NULLs in the database in column "head" // then make sure the query converts it to an empty string. For example: // SELECT IFNULL(head, '') AS head ... $head = NULL; // Process one row at a time while ($row = $stmt->fetch()) { if ($row['head'] !== $head) { // The value of 'head' just changed // Display '</div>' but not before the first row if ($head !== NULL) { // This is not the first row, there is a current value of 'head' echo("</div>\n"); } // Display the opening tag '<div>' and new value of 'head', only once echo("<div>{$row['head']}: "); // Update the current value of 'head' $head = $row['head'] } // Display 'name'; there is nothing special here echo($row['name']); } // After the loop, close the last <div> only if there is one ($head was changed) if ($head !== NULL) { echo("</div>\n"); } 。字符串(称为&#34; sentinel&#34;),无法显示在数据库的NULL列中。