2011-07-20 129 views
0

我有我的數據庫字段中它命名爲tag_info變量我會出現像這樣的數據:用空格分隔查詢MySQL數據庫與數組

arm leg head forearm foot 

標籤(不知道這是最好的方式所以我很樂意提供建議)

現在我需要編寫一個查詢,它將返回tag_info字段中具有特定標記的所有行。但是我正在尋找的標籤並不需要至少存在其中的一個。

$ find_tags =陣列( 「臂」 腿 「);

$查詢=」 SELECT * FROM MyDatabase的WHERE tag_info = '$ find_tags'

這是可能的?如果我的問題是沒有意義的只是讓我know.foot

+0

哇感謝所有偉大的反饋,我將根據你的反饋做一些研究,看看哪種解決方案最好。 – Denoteone

+0

在這裏看到我的回答 http://stackoverflow.com/questions/3966416/how-do-i-select-a-row-in-mysql-that-c​​ontains-multiple-values/3966466#3966466 –

回答

2

您應該首先更改數據庫模式。而不是存儲由空格分隔的標籤。

你能告訴我你的表的模式(列名)嗎?我認爲這是一個你應該有兩張桌子的情況。一個單獨的表格僅用於標籤。

+1

也許是一個標籤表和一個用於將標籤映射到原始表的表格。 – AndrewR

+0

+1是的。這可能是最好的答案,他不想聽到的答案= D –

+0

我可以用標籤創建另一個表格,但是我應該將它們全部存儲在同一個字段中嗎? – Denoteone

0

mysql的語法不工作的方式

這裏什麼工作。

$query = "SELECT * FROM mydatabase 
      WHERE tag_info = '".$find_tags[0]."' OR tag_info = '".$find_tags[1]."'"; 

在你的情況下,由於標籤都在一個領域,你可以使用通配符:%

$query = "SELECT * FROM mydatabase 
      WHERE tag_info LIKE '%".$find_tags[0]."%' OR tag_info LIKE '%".$find_tags[1]."%'"; 
-1

查詢應該是這個樣子

SELECT * FROM mydatabase WHERE tag_info = 'arm' OR tag_info = 'leg' 

您也可以使用MySQL IN子句:

SELECT * FROM mydatabase WHERE tag_info IN ('arm', 'leg') 

這種方式更容易建立查詢字符串

編輯

我剛纔看到你持有的DB序列化的標籤。現在,這絕對不好,因爲你正在破壞結構化數據的概念。

您應該創建一個名爲tags的表格,並將每個標籤保留在其自己的行上。在希望標記的表(現在包含序列化標記的表)和標記表之間創建另一個數據透視表。

數據透視表可以容納僅有2場 - main_table_idtag_id - 這樣一來,你就可以查詢您的數據庫有一個連接,如:

SELECT t.* FROM tags t 
    INNER JOIN pivot_table pt ON pt.tag_id = t.id 
    INNER JOIN main_table mt ON mt.id = pt.main_table_id 
WHERE tag IN ('arm', 'leg') 
+0

韓元如果郵局在他的案件中有很多標籤,那麼他就沒有用。 –

+0

現在呢? –

0

查詢與where tag_info like '%arm%' or tag_info like '%leg%' 但這將是相當效率低下,更好地存儲標籤每行一個標籤,有一個索引。

-1

當然,在WHERE子句中使用LIKE而不是=。

SELECT * FROM mydatabase WHERE tag_info LIKE '% foot %' or tag_info LIKE '% leg %' 
+0

如果前面或標籤末尾還有空格,則不起作用。 –

+0

不,空間是必要的。他說他們是空間分開的。是的,第一個在它之前需要一個空格,最後一個需要一個空格,但是如果你不使用LIKE中的空格,搜索'%arm%'也會匹配前臂。 – AndrewR

+0

好吧,但這不是他目前的狀態,你沒有說明他應該在標籤周圍留下空白,並且這不是一個好的解決方案,因此值得-1。 –

0

不可能寫出這樣的查詢,因爲您必須動態更改WHERE等於或等於的語句數量。一種方法是將數據庫中的所有數據抓取到PHP數組中。進入數組後,您可以通過編程方式搜索結果並消除不匹配的結果。

,如果你要搜索不同的標記,也就是說,如果你只需要 $ find_tags =陣列(「胳膊,」腿「)的特定查詢;其他的答案將工作

0

你可以試試。下面的查詢。

$query = "SELECT * FROM mydatabase WHERE tag_info IN ('$find_tags'); 

如果您正在使用表名和字段名稱是否正確,那麼這可能是要緊的給你。

感謝。

0
$keywords = array("arm", "leg"); 
$length = count($keywords); 
$searchCriteria = ''; 

for($i = 0; $i < $length; $i++) 
{ 
    $searchCriteria = $searchCriteria . "tag_info like '%" . $keywords[$i] . "%'"; 

    if(($i+1) < $length) 
     $searchCriteria = $searchCriteria . " OR "; 
} 

$query = "SELECT * FROM mydatabase 
      WHERE $searchCriteria"; 

如果包含標籤的數組爲空,您可能需要添加一些額外的檢查以確保您不會遇到錯誤。

0

更正確的方法是在tag_info和tag_table之間添加帶有可用標籤和鏈接表的標籤表。

但這裏是一個查詢

$query = "SELECT * FROM mydatabase WHERE "; 

foreach($find_tags as $tag) 
{ 
$query .= "tag_field LIKE %$tag% OR "; 
} 

$query = substr($query, 0, strlen($query) - 3); 

未測試的解決方案!

1

這不是做標記的好方法。您應該有一個標記表(id,name),yourdatabase_tags(yourdatabaserecord_id,tag_id),以便您可以將數據庫表中的記錄與標記表中的標記相關聯。

所以,當你有一個標籤列表,做一個查詢來獲得他們的id,然後查詢yourdatabase_tags獲取具有該tag_ids的record_ids,然後查詢您的數據庫的記錄。或者你可以將它們組合成一個查詢(這是一個留給讀者的練習:))

+0

很好的解釋。 – Denoteone