如何从不同的行获取唯一值

时间:2012-06-28 14:37:25

标签: php mysql

我有一个数据库,其中包含演员姓名的行示例

row1       row2
movie1     actor1,actor2,actor3
movie2     actor2
movie3     actor1,actor3,actor4,actor6

现在我想在一个页面中显示一个actor列表,其中没有重复的actor。 有可能......输出应该是

actor1
actor2(no repeate)
actor3
actor4

这里wt是我在尝试

function actors(){
    global $host, $dbname, $user, $pass;
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    $STH = $DBH->prepare("SELECT DISTINCT actors FROM movies");

    $STH->execute();
    $STH->setFetchMode(PDO::FETCH_ASSOC);
    return $STH;
    }

$STH = actors();
     while (($row = $STH->fetch()) !== false) {
     echo $row['actors'].'</br>';
     }

但这不起作用......请帮忙 的修改 我正在获得输出

actor1,actor2,actor3
actor2
actor1,actor3,actor4,actor6

2 个答案:

答案 0 :(得分:2)

如果要将所有actor名称保留在单个字段中,我不知道可以执行此操作的简单SQL查询。它可能不可能或者应该花费很多CPU。

您需要重新设计表格,如下所示。

movies
------
id
name

actors
------
id
name

movie_actor_link
----------------
movie_id
actor_id

执行此操作后,列出演员已经非常简单,因为他们拥有自己的具有唯一值的表格。

答案 1 :(得分:1)

您所寻求的内容要求您首先将actor值拆分为行,然后使用DISTINCT查询。

这是Federico Cargnelutti

的示例
CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

然后我们的查询可能如下:

Select Distinct actor
From (
     Select Split_Str( actor, ',', 1 ) As actor From Movies
     Union All Select Split_Str( actor, ',', 2 ) From Movies
     Union All Select Split_Str( actor, ',', 3 ) From Movies
     ...
     Union All Select Split_Str( actor, ',', n ) From Movies
     ) As Z

来自