我在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
我现在正在使用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>
在创建一个代表我的SQL表的类之前,我已经解决了这个问题。然后我创建了一个DictionaryholdEmployeeId和class。
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);
我正在跳过步骤,但我希望您能理解我的意思。我可能只需要用什么关键字来称呼这种类型的问题。完成此操作的首选方式是什么?
由于某种原因,我不喜欢SQL解决方案。您要求数据库引擎加入字符串,然后使用PHP对其进行拆分。这就像重复的工作。另一个metavalue缺点是如果包含分隔符。
metavalue
我的代码仅演示了如何在PHP中轻松地使用2维数组对数据进行分组,并且由编码器决定哪种方法从旧版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);
无需将整个结果集临时存储到数组中。您可以先对数据进行排序,然后再按要对数据进行分组并跟踪状态的字段进行排序,从而直接进行迭代。
但是,我偏爱这种样式有两个原因,这是个人喜好(这不是必须做的解决方案):
通常,每个人都希望将逻辑和表示分开。数组中存储数据可以轻松地传递到模板引擎。我更喜欢使用PHP模板引擎,因为它易于实现并且运行速度很快。
我宁愿以略微的性能速度和内存使用量为代价,以提高可读性和可维护性。该算法简短易懂。如果性能是您的头等大事,则始终可以使用缓存,例如存储在文件中,存储在memcached中或将计算结果存储在数据库中。
的确,我们正在从不同的方面对数据进行分组,但是您假定的metavalue不包含分隔符(在您的代码中为|)。通过选择几乎无法使用的分隔符可以很容易地修复它metavalue。无论如何,您的解决方案在几乎所有情况下都可以正常使用,因为metavalue@jvelez所显示的将永远不会包含字符|。