具有多个id的mysql选择查询

时间:2013-03-16 05:47:42

标签: php mysql sql join

好吧,我有一个像这样的Mysql表( oc_calendar ):

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..
}   

现在我正在尝试根据变量 $ search_p_id 获取另一个表( property_step1 )信息,但后面的查询却显示错误。可能是我的查询不正确。

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

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

为什么它会显示错误消息,Any Idea?

4 个答案:

答案 0 :(得分: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值列表,然后从第二个值中选择列表中propertyid的所有行。使用username谓词从第一个表中选择的IN个值。所以,我使用JOIN它就像谓词IN,但它更安全,让你从两个表中选择列。


请注意:请使用Mysql_ *扩展程序 停止 ,您的代码以{{3}开放},它也被弃用了。请改用SQL Injection或预备语句。

答案 1 :(得分: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) . ")"); 

答案 2 :(得分: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..
}   

答案 3 :(得分: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) . ")");