使用冒号分隔符查找逗号分隔值

时间:2012-12-15 04:18:51

标签: php mysql

我在数据库中为tourneyID,Selected,Paid,Entered,date设置值,然后用冒号分隔每个选择

所以我有一个看起来像这样的字符串

    187,S,,,09-21-2013:141,S,,,06-21-2013:144,S,,,05-24-2013 

但它也可能看起来像这样

    145,S,,,07-12-2013:142,S,,,05-24-2013:187,S,,,09-21-2013

有时看起来像这样

    87,S,,,07-11-2013:125,S,,,06-14-2013

我想找到这个序列:187,S,,,09-21-2013

我有这样的数据存储,因为我付钱给程序员为我编码。现在,正如我所知,我认为这不是最好的解决方案,但它是我所拥有的,直到我了解更多并且它正在发挥作用。

我的问题是当使用LIKE时它返回187和87值

    $getTeams = mysql_query("SELECT * FROM teams 
    WHERE (team_tourney_vector LIKE '%$tid,S,P,,$tourney_start_date%' 
    OR team_tourney_vector LIKE '%$tid,S,,,$tourney_start_date%') 
    AND division='$division'");

我使用FIND_IN_SET()尝试过此操作 但它只会返回此字符串的团队ID

187,S,,,09-21-2013:141,S,,,06-21-2013:144,S,,,05-24-2013

并且找不到此字符串的团队ID

145,S,,,07-12-2013:142,S,,,05-24-2013:187,S,,,09-21-2013

   SELECT * FROM teams WHERE FIND_IN_SET('187',team_tourney_vector) AND (team_tourney_vector LIKE '%S,,,09-21-2013%')

有关如何实现这一目标的任何想法?

3 个答案:

答案 0 :(得分:2)

通过以您正在使用的格式存储数据,您将使此任务变得更加困难。

您需要将tourney矢量存储在单独的表中。每个锦标赛都在一个单独的行中,每个逗号分隔的字段都在一个单独的列中。

然后,您可以使用SQL查找特定匹配的$ tid行,甚至可以使用索引来帮助加快搜索速度。

此外,MySQL日期应以YYYY-MM-DD格式存储。

另请参阅我对Is storing a delimited list in a database column really that bad?

的回答

答案 1 :(得分:0)

不要使用sql。使用PHP strpos

要容易得多
$getTeams = mysql_query("SELECT * FROM teams WHERE division='$division'");

while ( $rows = mysql_fetch_array($getTeams) ) {
  if ( strpos($rows['team_tourney_vector'],'187,S,,,09-21-2013') ) {
    echo $rows['team_tourney_vector'];
  }
}

答案 2 :(得分:0)

以下是使用RLIKE

解决上述问题的方法
    $tourney_start_date=date('m-d-Y', strtotime($tourney_start_date));
    $vector = '"'.$tid.',S,,,'.$tourney_start_date.'"';
    $getTeams = mysql_query("
    SELECT * FROM `teams` 
    WHERE `team_tourney_vector` 
    RLIKE $vector 
    AND division='$division'");