1

例にアクター名を持つ行を含むデータベースがあります

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

今、私はその中にリピートアクターがない1ページにアクターのリストを表示したい..それは可能ですか...出力は

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
4

2 に答える 2

2

すべてのアクター名を 1 つのフィールドに保持している場合、これを実行できる単純な SQL クエリを私は知りません。おそらく不可能であるか、多くの CPU を消費するはずです。

以下のようにテーブルを再設計する必要があります。

movies
------
id
name

actors
------
id
name

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

これを行った後、一意の値を持つ独自のテーブルがあるため、アクターを一覧表示するのは非常に簡単です。

于 2012-06-28T14:43:32.853 に答える
1

求めるには、最初にアクターの値を行に分割してから、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

から

于 2012-06-28T14:47:18.887 に答える