【问题标题】:writing a second query based on results of the first - Not working根据第一个查询的结果编写第二个查询 - 不工作
【发布时间】:2013-08-25 16:21:15
【问题描述】:

*MySQL 稍后会升级。

前言:作者可以用两种语言注册,并且由于各种其他原因,这意味着 2 个数据库。我们意识到在使用多个数据库时设置看起来很奇怪,但更多的是这个简短的解释使它看起来如此。所以请忽略那个奇怪的东西。

情况: 我的第一个查询生成了已取消订阅的作者的记录集。它在第一个数据库中找到它们。

require_once('ConnString/FirstAuth.php');

mysql_select_db($xxxxx, $xxxxxx);
$query_Recordset1 = "SELECT auth_email FROM Authors WHERE Cancel = 'Cancel'";
$Recordset1 = mysql_query($query_Recordset1, $xxxxxx) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);

在它们也被列出的第二个数据库中,(表名和列名相同)我想更新它们,因为它们已取消。要选择他们的记录进行更新,我想获取第一个记录集,将其放入一个数组中,换出 connStrings,然后使用该数组进行搜索。

这些也有效。

$results = array();
do {
results[] = $row_Recordset1;
} while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));

print_r($results);

给了我一个数组。数组 ( [0] => 数组 ( [auth_email] => renault@autxxx.com ) [1] => 数组 ( [auth_email] => rinaldi@autxxx.com ) [2] => 数组 ( [auth_email] => hemingway@autxxx.com )) ...所以我知道它正在寻找第一组数据。

问题是:第二个数据库的查询通过 auth_email 查找作者,如果它是“IN”$results 数组,但它没有像我预期的那样在第二个数据库中找到作者。请注意不同的 connString

require_once('ConnString/SecondAuth.php');

mysql_select_db($xxxxx, $xxxxxx);
$query_Recordset2 = "SELECT auth_email FROM Authors WHERE auth_email IN('$results')";
$Recordset2 = mysql_query($query_Recordset2, $xxxxxx) or die(mysql_error());
$row_Recordset2 = mysql_fetch_assoc($Recordset2);

var_dump 为 0,但我知道应该找到两条记录。 我已经尝试过各种 IN 组合,例如 {$results},但是当我遇到“'$results'”时,是时候寻求帮助了。我检查了所有可用的帖子,但没有一个能解决我的问题,尽管我现在对野鹅种群更加熟悉了。

我想既然我换掉了连接字符串,可能 $result 被设为 null 所以我将它重新设置为原始 connString 并且它仍然没有在它肯定应该有的同一数据库中的 $results 中找到 auth_email完成。

此外,我之前已经换掉了 connStrings 并获得了积极的结果,所以...嗯...

我的目标是在工作时将 Recordset2 回显到一个带有 do/while 循环的表单中,这将允许我更新他们在第二个数据库中的记录。由于 var_dump 为 0,显然下面的这并没有给我第二个表中的作者列表,其电子邮件地址出现在 $results 数组中,但我将其作为示例包含在页面中启动表单的示例.

do { 
    $row_Recordset2['auth_email_addr '];
} while($row_Recordset2 = mysql_fetch_assoc($Recordset2));

一如既往,感谢您提供的任何指点,并接受正确的答案。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    如果您有一个可以访问数据库和表的 db 用户,只需使用跨数据库查询进行更新

    UPDATE
      mydb.Authors,
      mydb2.Authors
    SET
      mydb.Authors.somefield = 'somevalue'
    WHERE
      mydb.Authors.auth_email = mydb2.Authors.auth_email AND
      mydb2.Authors.Cancel= 'Cancel'
    

    【讨论】:

    • 嗯,您的回答实际上可能会以一种不同的、意想不到的方式加快速度。让我看看这个,稍后再发表评论。谢谢@Patrick。
    • 感谢@Patrick 的帮助。我实际上正在使用你的两个答案来解决这个问题并让它发挥作用。
    【解决方案2】:

    IN 子句不包括像 IN(var1,var2,var3) 这样格式的变量 您应该使用函数来创建一个字符串,其中包含该数组中的变量。

    //the simplest way to go
    $string = '';
    
    foreach($results as $r){
     foreach($r as  $r){
     $string .= $r.",";
     }
    }
    
    $string = substr($string,0,-1); //remove the ',' from the end of string
    

    它没有经过测试,显然不是最好的方法,但是向您展示您的问题的想法以及如何处理它与此代码非常相关。

    现在在查询中使用$string 而不是$results

    【讨论】:

    • 这看起来很有趣,并引发了一些想法。我会进一步查看并回复您。谢谢@JTC
    • 嗨@JTC,我一直在搞砸这个,因为它看起来不错,但它给了我数组,数组,数组,数组,数组,数组,数组。我显然错过了一些东西
    • 我只是编辑评论,使用这个代码,你有多维数组,如果这不起作用,用var_dump($results);显示数组
    • 知道了@JTC。感谢您的跟进。你让我免于浪费更多时间。
    猜你喜欢
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多