2012-06-28 32 views
0

好的,我已经查找了几种完成此操作的方法,并且它们都不适用于我,请告诉我为什么我尝试的方法不起作用的一些细节。在mysql中分割字符串

我试过SUBSTRING_INDEX,因为我们大多数人都知道它只是基于字符串中分隔符的数量进行“拆分”,并且它对于所有行都不是相同数量,所以这是一个没有去,我也试过在这里找到的方法http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/

我再次相信它会基于您的查询分隔符的数量。

我已经搜索并搜索了一种方法来完成这项工作,而我无法找到一种方法来实现它。我仍然是PHP的一个新手,所以这可能是一个简单的修复,我只是忽略它,但我不确定。

以下是我正在处理的内容;

这是SQL查询

$sql = "SELECT * FROM offers WHERE type='$type' and country='$membercountry' LIMIT $start, $limit"; 
    $result = mysql_query($sql); 

country的是,有我的逗号分隔的字符串列。有些行只是有一些像US而其他人有US,AU,CA,GB

我需要拆分这些的原因是因为实际显示提供的页面检查,看用户国家是否匹配提供国,它显然会去当它将整个长字符串读取时不匹配,这意味着这些优惠不会显示给用户。

我和我的一位朋友聊过,他说要用explode(),但我确信你不能在sql查询中使用explode()

我知道我可能没有解释得这么好,我一直在这个项目上工作,所以我有点累。此外,作为一个说明,我知道我可以将它提供给每个提供不同国家/地区的优惠的多行,但其中一些优惠允许所有国家/地区执行,这意味着对于一个优惠我想要243行,这会让我觉得我只是马虎!

如果有人能给我一个正确的方向,我会非常感激!

谢谢,凯西

+1

“正确的方向”是规范化数据结构:而不是将此类列表存储在分隔字符串中,而是创建一个将“(offer,country)”对关联的单独表。 [我对类似问题的回答]中的更多详细信息(http://stackoverflow.com/a/10881627/623041)。 – eggyal

回答

1

像这样的东西可能会制定出:

$sql = "SELECT * FROM offers WHERE type='$type' and country LIKE '%$membercountry%' LIMIT $start, $limit"; 
+0

或者这可以确切地匹配:'$ sql =“SELECT * FROM offers WHERE type ='$ type'and CONCAT(',',country,',')LIKE'%,$ membercountry,%'LIMIT $ start,$ limit“;' – Matthijs

+0

@Matthijs ..以及如果国家会在字符串的开头,那里没有逗号? :) – geertjanvdk

+0

@geertjanvdk这就是为什么我添加了一个CONCAT,以预先和附加一个逗号。 – Matthijs

3

奇/坏数据设计位:多个国家在名为country列。除此之外,你可以用FIND_IN_SET()做点什么。

mysql> SELECT * FROM offers WHERE FIND_IN_SET('CA', country); 

性能明智..它不会是伟大的,但我希望你能利用的良好指标等领域中进行选择。