1

好吧,我有一个这样的 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) . ")"); 

为什么它显示错误消息,任何想法?

4

4 回答 4

5

不需要两个查询,您可以只用一个查询来执行此操作,方法是JOINing 两个表:

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的值列表中。所以,我用它就像谓词,但它更安全,让你从两个表中选择列。usernameINJOININ


请注意:停止使用Mysql_* 扩展,这种方式的代码对SQL 注入是开放的,它也已被弃用。请改用PDO或准备好的语句。

于 2013-03-16T05:51:24.033 回答
2

您不能使用implode()非数组数据。您应该将 value 的$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) . ")"); 
于 2013-03-16T05:52:58.957 回答
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..
}   
于 2013-03-16T05:51:41.707 回答
1

您首先使用不推荐使用的 mysql api,如 Mahmoud 所说,切换到 pdo。

其次,您在非数组上的 $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) . ")"); 
于 2013-03-16T05:53:59.547 回答