2010-06-20 60 views
1

實例DB結構(download table)如何添加多個或MySQL查詢

id | pid  | title 
---------------------------------------------------- 
1 | 3,4,5 | Download 3, Download 4, Download 5 
---------------------------------------------------- 
2 | 3  | Download 3 
---------------------------------------------------- 

這裏是我的代碼

<?php 
    $pid = explode(",", $order['pid']); 
    for($x = 0; $x < count($pid);){ 
    if(count($pid) == 1) { 
    $thepid = 'pid="'.$pid[$x].'"'; 
    } else { 
    $thepid = 'pid="'.$pid[$x].'" OR '; 
    } 
$x++; } 

$select = 'SELECT * FROM download WHERE '.$thepid.''; 
$query = $db->rq($select); 
while($download = $db->fetch($query)) { 
?> 

問題 -

  1. 如何使$select可以閱讀pid="3" OR pid="4" OR pid="5" if count($pid)多個。

我知道表結構不正常。但如何才能實現它的工作。

+1

相關:http://stackoverflow.com/questions/3030906/multiple-or-clauses-in-mysql – 2010-06-20 21:54:48

回答

2

也許我過於簡化這一點,但止跌這容易嗎?

<?php 

$select = 'SELECT * FROM download WHERE pid IN ('.$order['pid'].')'; 
$query = $db->rq($select); 
while($download = $db->fetch($query)){} 
?> 
+0

謝謝!在這個時候簡單的解決方案來保持當前的結構。 – kampit 2010-06-20 08:00:03

+0

@kampit:這不應該起作用。我看不出''pid ='3,4,5''pid IN('3','4','5')是如何實現的,因爲元素3,4,5'是不在集合中。這對你真的有用嗎? – 2010-06-20 08:08:24

+1

我的示例返回的SQL查詢看起來像 SELECT * FROM download WHERE pid IN(3,4,5); WHERE/IN需要一個數組。構建查詢時使用的字符串連接將使其成爲可接受的格式,以便mysql將其作爲數組讀取。 而且它不需要是相同的順序。 擁有pid =「5,3,4」的問題仍然由非常簡單的初等級SQL解決。 SELECT * FROM download WHERE pid IN(5,3,4)ORDER BY pid ASC; 將返回記錄3,4和5(按此順序) – jbudge 2010-06-20 08:11:18

0

如果你想利用這種結構,堅持(這是不是最佳的,如果你想這樣的質疑),你可以使用LIKE

SELECT * FROM download WHERE pid LIKE '%3%' OR pid LIKE '%4%' OR pid LIKE '%5%' 

但你會惹上麻煩,如果你有一個數字> 9

我真的很推薦正常化你的表!


對你的代碼的一些評論。

  1. 您的for循環看起來很奇怪。爲什麼最後要增加$x而不是在循環的「頭部」中定義它?
  2. 您在for循環中一次又一次地重新分配$thepid,因此它將具有最後一次迭代的值。
  3. 您經常使用count()

這裏是一個改進版本,但要注意,這並不只適用,如果你的表是標準化

<?php 
    $pids = explode(",", $order['pid']); 
    $conds = array(); 
    foreach($pids as $pid) { 
     $conds[] = 'pid="'.$pid.'"'; 
    } 

    $conds = implode(' OR ', $conds); 

    $select = 'SELECT * FROM download WHERE '.$cond.''; 
    $query = $db->rq($select); 
    while($download = $db->fetch($query)) { 
+0

感謝兄弟的解釋。稍後將對錶格進行規範化。 – kampit 2010-06-20 07:58:48

1

使用REGEXP

SELECT * FROM download WHERE pid REGEXP '\\b(3|4|5|12)\\b' 

如果\\b不支持,你可以嘗試:

SELECT * FROM download WHERE pid REGEXP '(^|,)(3|4|5|12)(,|$)' 
2

這不是表示數據的好方法。

我假設你的列代表像

ID - > user_ID的

PID - >用戶(以逗號分隔)

標題下載了所有項目的列表 - >列表用戶下載的所有項目名稱(以逗號分隔)

這種方法的事情是,您會發現像這樣的查詢比使用常規方法更難以表達。例如:

表用戶

USER_ID

表文件

PID

標題

表下載

user_id說明

PID

既作爲外鍵對應的表

您的查詢就會成爲

<?php 
    $pid = explode(",", $order['pid']); 
    for($x = 0; $x < count($pid);){ 
    if($x == 0) { 
    $thepid = 'pid='.mysql_real_escape_string($pid[$x]); 
    } else { 
    $thepid = 'OR pid='.mysql_real_escape_string($pid[$x]); 
    } 
$x++; } 

$select = 'SELECT user_id FROM download WHERE '.$thepid.''; 
$query = $db->rq($select); 
while($download = $db->fetch($query)) { 
?> 
+0

感謝您的解釋。 – kampit 2010-06-20 07:57:47

+0

我同意,將多個數據存儲在單個列中通常不是好事。它迫使你以後(在這裏用PHP)處理數據,而不是用SQL查詢過濾數據。 – 2011-04-24 02:38:04