剥离逗号分隔值

时间:2012-03-21 11:34:05

标签: php mysql sql

我正在使用PHP和MySQL数据库

我有一张表有一栏:演员

在表格的一行中,在actors列中,可能列出了几个参与者,例如Denzel Washington,Charlie Sheen,Matt Damon

下一行可能是:Matt Damon,Robert De Niro,Denzel Washington

他们总是以逗号分隔。

我有一个自动完成功能,我要求用户选择一个演员。因此,当自动完成在列中查找时,它将返回整个列值。

e.g。搜索Denzel的人会获得自动完成结果:

Denzel Washington,Charlie Sheen,Matt Damon 马特达蒙,罗伯特德尼罗,丹泽尔华盛顿

据我所知,没有办法在这个级别分离这个,所以我想我可能不得不从这个表中删除演员,进入一个只为自动完成提供服务的独立表。

这是最好的方法,如果是这样,可以做到吗?是否有一个简单的SQL查询,我可以使用它来单独,然后加载另一个表。这是不断更新的数据,因此需要每天运行,但我认为如果我将新表中的actor列作为唯一,那么我将不会有重复。

或者有更有效的方法吗?

注意:我需要指出这是一个XML提要,我无法控制数据 - 是的,我知道它应该全部分开,但不幸的是我只是在处理我的工作< / p>

4 个答案:

答案 0 :(得分:2)

你需要的是这样的东西

table actors

    id | name 

table actor_entries

    id | data_id | actor_id

table data

    id | <other columns>

然后您的数据会像这样

table actors
1 | Denzel Washington
2 | Charlie Sheen
3 | Robert De Niro

table data
1 | some data // this row is associated with actors 1 and 2
2 | some data // this row is associated with actors 2 and 3

table actor_entries ( id | data_id | actor_id )

1 | 1 | 1
2 | 1 | 2
3 | 2 | 2
4 | 2 | 3

答案 1 :(得分:1)

你应该拥有的是三个不同的表:

Movies         Actors        MovieActors
----           ----          ----------
movie_id PK    actor_id PK   movie_id FK
title          name          actor_id FK
year           born
               gender

然后你就不会有那么大的混乱。您也可以搜索数据

SELECT Actors.name FROM Actors WHERE Actors.name LIKE '%Pam' LIMIT 5

或者获取演员所参与的所有电影:

SELECT 
    Movies.title
FROM Movies
    LEFT JOIN MovieActors USING(movie_id)
    LEFT JOIN Actors USING(actor_id)
WHERE 
    Actors.name = 'Foo Bar'
    AND Movies.year > 1990

如果您已经了解SQL的基础知识,我建议您阅读SQL Antipatterns。那本书涵盖了许多其他问题。

答案 2 :(得分:0)

你可以使用php explode函数和','作为分隔符。它将返回一个包含所有数组的数组 演员姓名

答案 3 :(得分:0)

这可能不是一种非常好的存储数据的方法,因为一旦csv达到一定的大小,它就会变得非常缓慢和难以维护。

无论如何,至于你的问题,请告诉我这是否有帮助:

<?php
$search = $_GET['search']; // assume it's 'de'
$result = array(); // this contains the result

$sql = 'SELECT `actors` from `tablename`;';
$run = mysql_query( $sql );

if ( $run && mysql_num_rows( $run ) ) {
   while ( ( $data = mysql_fetch_assoc( $run ) ) !== FALSE) {
      $num = explode( ',', $data[ 'actors' ] );

      for ($i=0; $i < $num; $i++) {
         if( stripos( $data[ $i ], $search ) !== false ) {
            $result[] = trim( $data[ $i ] );
         }
      }
   }        
}

// here's the result you want
$result = array_values( array_unique( $result ) );
?>

这将有效,但正如许多人所建议的那样,这不是一个很好的选择。