簡體   English   中英

逗號分隔值

[英]Strip comma separated value

我正在使用PHP和MySQL數據庫

我有一個表格,其中有一欄:演員

在表格中的“演員”列中的一行中,可能列出了幾個演員,例如丹澤爾·華盛頓,查理·辛,馬特·達蒙

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

它們始終以逗號分隔。

我有一個自動完成功能,在這里我要求用戶選擇一個演員。 因此,當自動完成功能在列中查找時,它將返回整個列的值。

例如,搜索Denzel的人將獲得其自動完成結果:

丹澤爾·華盛頓(Denzel Washington),查理·辛(Charlie Sheen),馬特·達蒙(Matt Damon),馬特·達蒙(Robert Da Niro),羅伯特·德尼羅(Robert De Niro),丹澤爾·華盛頓(Denzel Washington)

據我所知,沒有辦法在這個級別上將其分開,所以我想我可能不得不從該表中刪除參與者,成為一個單獨的表,該表只為自動完成服務。

這是最好的方法嗎?如果可以,可以做到嗎? 是否有一個簡單的SQL查詢,我可以單獨使用以將actor移出,然后加載另一個表。 這是不斷更新的數據,因此需要每天運行,但是我假設如果新表中的actor列是唯一的,那么我就不會重復。

還是有更有效的方法?

注意:我需要指出,這是XML提要,並且我無法控制數據-是的,我知道它應該與一開始就分開,但是不幸的是,我只是在使用已有的東西

您需要的是這樣的東西

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

您應該擁有的是三個不同的表:

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

您可以使用帶有','作為分隔符的php explode函數。 它將返回一個包含所有actor名稱的數組

這可能不是一種很好的數據存儲方式,因為一旦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 ) );
?>

這將起作用,但是正如許多人所建議的那樣,這不是一個很好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM