2012-08-16 126 views
0

用户表是这样的:mysql,如何将数组中的值存储为字段值?

user_id | key  | value 
1   option  $array 
2   other  abc 
2   option  $array 

我需要查询所有用户的选项字段,该值是一个这样的数组:

$array=array('item_id'=>123, 'key1'=>'abc', 'key2'=>'1', 'key3'=>'5',) 

然后,总结在这个键2的所有值阵列。

我能想到的唯一方法就是将每个阵列的虚拟表作为一行。也许这是不可能的。那么,如何在选项字段中为所有用户的key2创建总和?

+0

它是否需要在查询本身,或者如果在查询之外使用某些逻辑,它是否没有问题? – 2012-08-16 23:47:31

+0

这并不重要,我只需要key2的总值,当用户保存一些新的信息时,我需要重复执行SUM。 – Jenny 2012-08-16 23:53:39

+0

你能够从数据库中发布一小段数据吗? – Diego 2012-08-16 23:58:57

回答

0
$query = mysql_query("SELECT * FROM table WHERE key = 'option'"); 

while($row = mysql_fetch_array($query)){  
    $array_sum_values[] = $row['value']['key2']; //We are creating a new array. } 

$result = array_sum($array_sum_values); 

如果我明白你的确切解决方案。

还或者,

$query = mysql_query("SELECT * FROM table WHERE key = 'option'"); 
$array_sum = 0; 
while($row = mysql_fetch_array($query)){  
    $array_sum += $row['value']['key2']; //We are creating a new array.} 
+0

从$ array_sum_values中删除[]?给总数? – Robbie 2012-08-17 00:08:53

+0

没有。我们创建了一个新的数组$ array_sum_values。当我们创建我们的数组。我们将数组中的每个值与array_sum相加 – 2012-08-17 00:12:20

+0

啊 - 错过了最后一行。是的 - 你的回答是对的,但为什么不简单地总结第一步,并跳过第二个数组?清洁并节省内存/时间。 – Robbie 2012-08-17 00:16:52

1

除了吉汗的答案(汇总各行),或在数据库中创建一个视图(和视图需要了解数组的序列化),然后以最快的方式将应该将数据“正确地”存储起来,而不是像这样一个冗长的领域。

如果你想快速和定期总结,创建第二个表:

user_id | key  | array_key | value 
1   option  item_id  123 
1   option  key1   abc 
1   option  key2   2 
2   other  NULL   123 
2   option  item_id  456 

你可以离开array_key空(或NULL),如果它不是一个数组。

需要一点反思和重构一些代码,但如果你总结了很多,它会更干净,更容易调试,并且最终更快。创建新条目时需要更多行更新。

如果您需要单行,则可以使用GROUP BY和GROUP_CONCAT。

+0

我选择将数据保存为用户表中的字段的原因是因为usertable是原生wordpress表,缓存和其他相关作业将由wordpress自己处理。如果我创建一个新表格,我会自己完成所有的工作。也许我需要重新思考。 – Jenny 2012-08-17 00:19:42

+0

这一切都很好。首先让它开始工作,然后在需要时从那里改进。 – Robbie 2012-08-17 00:36:45