2013-11-26 87 views
1

我有2列像Mysql的筛选查询的WHERE条件

name price 
a|b|c 100|200|150 
x|y|z 150|100|160 

在这里,我想价格在价格> 150。我不知道如何爆炸?谢谢

+0

http://stackoverflow.com/questions/471914/can-you-split-explode-a-field-in-a-mysql-query http://stackoverflow.com/questions/5928599/equivalent-使用字符串在mysql中工作 –

+1

1.标准化您的数据 – Strawberry

+0

Hello,Jaywalker反模式!在创建查询时,不要试图处理分隔符分隔的值,而应该拆分值并将它们存储在链接表中 - 这将一劳永逸地解决所有问题 –

回答

1

你不能在MySQL中爆炸。我强烈建议你将表重构为关系型(即每个名称和价格应该占据一行)。

可能通过子字符串进行某种类型的数值比较,但我认为查询整个表格并通过php过滤结果会容易得多(我假设您使用的是php,因为您说的是explode ,其他语言通常称为split)。

foreach ($rows as $row) { 
    $names = explode("|", $row["name"]); 
    foreach (explode("|", $row["price"] as $idx => $price) { 
     if ($price > 150) { 
      $all_names[] = $name[$idx]; 
     } 
    } 
} 

这当然假设名称/价格列索引正确对齐。这也是昂贵的,因为它必须查询整个表并且不使用任何(MySQL)索引。


数据标准化的,你可以做的是有一个名为Groups表具有groupID。然后你有当前表与GroupID, name, price元组。您的数据是这样的:

groupID name price 
1   a  100 
1   b  200 
1   c  150 
2   x  150 
2   y  100 
2   z  160 

然后,你可以简单地检查WHERE price > 150,这将是非常快,如果price进行索引。它也可以让你按组搜索 - 这在某些情况下可能有用,甚至更快。

要根据您已有的表格设置上述表格,您必须查询整个表格,然后查询名称/价格,并通过相应索引插入现有组ID。