2012-06-28 2 views
1

У меня есть база данных с строкой, имеющие имя действующего лица в нем, напримерКак получить уникальное значение из разных строк

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

теперь я хочу, чтобы отобразить список актеров на одной странице, без повтора актера в нем .. возможно ... выход должен быть

actor1 
actor2(no repeate) 
actor3 
actor4 

здесь вес был я пытаюсь

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>'; 
    } 

но не работают ... пожалуйста, помогите Редактировать Я получаю OUTPUT

actor1,actor2,actor3 
actor2 
actor1,actor3,actor4,actor6 
+1

Что вы имеете в виду это не работает? Разрывается ли это? Не производит ли выход? Выдает ли он неправильный результат? – andrewsi

+0

@andrewsi у меня есть редактирование que с моим выходом ... – Harinder

ответ

2

Если вы оставляете все имена актеров в одном поле, я не знаю, простой SQL запрос, который может сделать это. Вероятно, это невозможно или стоит дорогого процессора.

Вам необходимо перестроить свои таблицы, как показано ниже.

movies 
------ 
id 
name 

actors 
------ 
id 
name 

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

После этого уже очень сложно перечислить актеров, так как у них есть своя таблица с уникальными значениями.

+0

Akaydin да, это так легко, но у меня уже есть большая база данных .. так есть способ, мы можем это сделать ?? – Harinder

+0

@Harinder Я бы потратил некоторое время, избавившись от вашей антивирусной базы данных; это лучшее время :) –

+0

Я думаю, все, что вам нужно сделать, это написать php-скрипт для преобразования таблиц в новую структуру. сначала создайте 3 пустые таблицы, как указано выше. то ваш скрипт должен прочитать вашу текущую таблицу подряд за строкой и вставить информацию о фильме в таблицу фильмов, а также разделить актерское поле с символом «,» и вставить всех участников в виде отдельных строк, наконец, вставить ссылки фильма/актера в таблицу ссылок, используя созданные идентификаторы , сценарий не должен занять много времени, и если вы допустили ошибку, всегда легко обрезать таблицы и повторить попытку. просто не прикасайтесь к основному столу. Я рекомендую резервное копирование. :) –

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 

От

Смежные вопросы