2012-03-21 110 views
0

我使用PHP和MySQL數據庫地帶逗號分隔值

我有有一欄表:演員

在表中的一行,在演員列,還有如上市也許幾個演員丹澤爾·華盛頓,查理辛,馬特·達蒙

下一行可能是:馬特·達蒙,羅伯特·德尼羅,丹澤爾·華盛頓

他們永遠是逗號分隔。

我有一個自動完成,我要求用戶選擇一個演員。所以,當自動完成在列中查找時,它會返回整個列的值。

例如有人尋找丹澤爾會得到他們的自動完成結果:

丹澤爾·華盛頓,查理辛,馬特·達蒙 馬特·戴蒙,羅伯特·德尼羅,丹澤爾·華盛頓

據我知道有沒有辦法,要獨立這因此我想我可能不得不將表格中的演員從表格中刪除,然後將表格單獨分配給自動填充。

這是做這件事的最好方法,如果是這樣,可以做到嗎?是否有一個簡單的SQL查詢可用於單獨獲取演員,然後加載另一個表。這是不斷更新的數據,所以需要每天運行,但我認爲如果我有一個新表中的actor列是唯一的,那麼我不會有重複。

或者是否有更有效的方法?

注意:我需要指出的是,這是一個XML提要,我無法控制數據 - 是的,我知道它應該從分手中分離出來,但不幸的是,我只是在使用我所擁有的

+4

您需要考慮數據的結構。爲了自動完成,沒有單獨的演員表,但爲了實現良好的標準化。回去整理一下,你的所有問題都會解決。 – 2012-03-21 11:36:04

回答

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)); 
?> 

這是可行的,但同樣,正如許多人認爲,這不是一個很好的選擇。

+0

@ darren-sweeney - 讓我知道這是否有效。 – 2012-03-22 10:33:58

+0

我的數據不在csv文件中 – 2012-03-22 12:42:35

+0

@ darren-sweeney - 我修改了它以從**表**中獲得結果。 – 2012-03-22 12:53:20

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 
+0

+1 - 值得一提的是,你應該在'actor_entries'表中的'data_id'和'actor_id'列中有唯一的索引。 – DaveRandom 2012-03-21 11:42:43

0

您可以使用PHP的爆炸函數「」作爲分隔符。它會返回一個數組的所有 演員的名字

+0

就像用勺子自殺一樣。 – 2012-03-21 15:07:33

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。這本書涵蓋了許多其他問題。