2013-03-16 71 views
1

好查詢,我有一個MySQL表(oc_calendar)是這樣的:Mysql的選擇與多個ID

id  start_date   username 
1  2013-04-04   18 
2  2013-03-31   19 
3  2013-04-04   19 
4  2013-04-02   19 
5  2013-04-03   18 

隨着我可以基於搜索結果的所有ID下面的查詢:

$search = mysql_query("SELECT DISTINCT username FROM oc_calendar WHERE start_date 
between '$from' AND '$to'"); 

while($re_search = mysql_fetch_array($search)) { 

$search_p_id = $re_search['username']; // here is the result Like: 18, 19 etc.. 
} 

現在我試圖通過以下查詢獲得另一個表(property_step1)基於變量$ search_p_id的信息,但顯示錯誤。可能是我的查詢不正確。

注:變量$ search_p_id可以是18或19,18等。

$search = mysql_query("SELECT * FROM property_step1 WHERE propertyid IN (" . 
implode(',', $search_p_id) . ")"); 

爲什麼它顯示錯誤消息,任何想法?

+0

您得到的錯誤消息是什麼? – amitchhajer 2013-03-16 05:50:37

+0

你應該說你收到了什麼錯誤 – rantsh 2013-03-16 05:50:51

回答

5

沒有必要對兩個查詢,你可以只用一個查詢做到這一點,通過JOIN荷蘭國際集團的兩個表:

SELECT p.* 
FROM oc_calendar AS o 
INNER JOIN property_step1 AS p ON o.username = p.propertyid 
WHERE o.start_date between '$from' AND '$to'; 

我假設連接條件:o.username = p.propertyid,因爲你得到username值的列表從第一個表中選擇第二個值中的所有行,其中使用IN謂詞從第一個表中選擇的username值列表中的propertyid。因此,我使用JOIN它類似於謂詞IN,但它更安全,並讓您從兩個表中選擇列。


需要注意的是:停止使用Mysql_ *擴展,你的代碼這種方式是開放的SQL Injection,它也已經過時。改用PDO或準備好的語句。

+1

謝謝,我正在嘗試。 – 2013-03-16 05:52:50

+0

@BabuAhmed - 隨時歡迎你:) – 2013-03-16 06:04:10

+0

是的,它的工作,謝謝你:) – 2013-03-16 06:04:23

1

$search_p_id當前不是數組,因此implode(',', $search_p_id)很可能會失敗。

改變你如何設置$search_p_id

while($re_search = mysql_fetch_array($search)) { 
    $search_p_id[] = $re_search['username']; // here is the result Like: 18, 19 etc.. 
} 
2

不能使用implode()非陣列的數據。您將數值爲$search_p_id的值更改爲數組。

$search = mysql_query("SELECT DISTINCT username FROM oc_calendar WHERE start_date between '$from' AND '$to'"); 
$search_p_id = array(); 

while($re_search = mysql_fetch_array($search)) { 
    $search_p_id []= $re_search['username']; // here is the result Like: 18, 19 etc.. 
} 

$search = mysql_query("SELECT * FROM property_step1 WHERE propertyid IN (" . implode(',', $search_p_id) . ")"); 
1

您首先使用棄用mysql api,切換到pdo,如Mahmoud所說。

其次,你在非數組上使用$ search_p_id的implode函數,這可能會給你帶來不希望的結果。請嘗試使用以下代碼:

$search = mysql_query("SELECT DISTINCT username FROM oc_calendar WHERE start_date 
between '$from' AND '$to'"); 
$search_p_id = array(); 
while($re_search = mysql_fetch_array($search)) { 
    array_push($search_p_id, $re_search['username']); 
} 

search = mysql_query("SELECT * FROM property_step1 WHERE propertyid IN (" . 
implode(',', $search_p_id) . ")");