我在MySQL数据库中有以下数据:
Autonum ID Name MetaValue
1 1 Rose Drinker
2 1 Rose Nice Person
3 1 Rose Runner
4 2 Gary Player
5 2 Gary Funny
Run Code Online (Sandbox Code Playgroud)
我现在正在使用PHP,但是我使用C#,Java和其他语言多次遇到过这个问题.
现在我过去和现在的目标是以下列格式显示数据:
<table>
<thead>
<th>Name</th>
<th>MetaValue1</th>
</thead>
<tbody>
<tr>
<td>Rose</td>
<td>
<ul>
<li>Drinker</li>
<li>Nice Person</li>
<li>Runner</li>
</ul>
</td>
</tr>
<tr>
<td>Gary</td>
<td>
<ul>
<li>Player</li>
<li>Funny</li>
</td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
我之前通过创建一个代表我的SQL表的类来解决这个问题.然后我创建了一个Dictionary
持有EmployeeId
和类.
Dictionary<string,MyTable> MyData = new <string,MyTable>();
Table MyMetaData = new Table();
MyMetaData SomeMetaData=getMetaValueList();//imagine a web service that does that
MyData.add(EmployeeId,SomeMetaData);
Run Code Online (Sandbox Code Playgroud)
我正在跳过步骤,但我希望你明白我的观点.我可能只需要关键字来称呼这类问题.完成此任务的首选方法是什么?
inv*_*sal 11
出于某种原因,我不喜欢SQL解决方案.您要求数据库引擎加入字符串,然后使用PHP将其拆分.这就像重复的工作.另一个metavalue
缺点是如果包含分隔符字符.
我的代码演示了如何在PHP中轻松地使用二维数组对数据进行分组,并且可以决定从数据库中检索遗留mysql_*或PDO的数据的方法.
// get result
$result = mysql_query("SELECT autonum,id,name,metavalue FROM table");
// loop through each row
while ($row = mysql_fetch_assoc($result)) {
$table[$row['name']][] = $row['metavalue'];
}
// print it out
print_r($table);
Run Code Online (Sandbox Code Playgroud)
无需将整个结果集临时存储到数组中.您可以通过首先按照要对数据进行分组的字段排序数据并跟踪状态来直接进行迭代.
但是,我喜欢这种风格有两个原因,这是个人偏好(这不是必须做的解决方案):
通常,每个人都希望将逻辑和表示分开.将数据存储在数组中可以轻松传递给模板引擎.我更喜欢使用PHP模板引擎,因为它易于实现,并且运行速度很快.
为了便于阅读和维护,我宁愿交易轻微的性能速度和内存使用量.该算法简短易懂.如果性能是您的首要任务,您可以始终使用缓存,例如存储在文件中,存储在memcached中,或将计算结果存储在数据库中.
没错,我们正在对来自不同方面的数据进行分组,但您假设metavalue
它不包含分隔符(在您的代码中是|).通过选择几乎不可能使用的分离器,可以很容易地修复它metavalue
.无论如何,你的解决方案几乎在所有情况下都能完美地运行,因为metavalue
@jvelez已经显示永远不会包含字符|.
问题不在于php/java/c#代码,而是在SQL的最后.
SELECT ID AS id,
Autonum AS num,
Name AS name,
GROUP_CONCAT
(
ORDER BY MetaValue DESC SEPARATOR '|'
) AS list
FROM Things
GROUP BY Things.ID
Run Code Online (Sandbox Code Playgroud)
这样,你得到的名单name
价值观,大家该项目的相关MetaValues,你只是分裂list
上'|'
.
在PHP中,您可以使用explode()
C#,String.Split()
并且,我认为,您将能够找到任何类似的语言.
HTML的生成变得非常简单.
这是一个PHP示例(使用PDO连接API):
$statement = $pdo->query( $sql );
if ( $statement->execute() )
{
$data = $statement->fetchAll(PDO::FETCH_ASSOC);
foeach ( $data as $row )
{
echo '<tr><td>' , $row['name'] , '</td>';
echo '<td><ul><li>' , str_replace( '|', '</li><li>' , $row['list']) ;
echo '</li></ul></td></tr>';
}
}
Run Code Online (Sandbox Code Playgroud)
这将生成<tbody>
示例中的内容.