【问题标题】:MYSQL - How do I use a SELECT as my WHEREMYSQL - 如何使用 SELECT 作为我的 WHERE
【发布时间】:2020-03-30 19:36:04
【问题描述】:

我有两个表recordingsrecording_metas,我想选择一些元数据并使用这些元数据中的外键来查找相应的记录。这就是我到目前为止所拥有的。 $recording_sql 输出这个

SELECT recording FROM recordings 
    INNER JOIN recording_metas 
    ON recordings.id = recording_metas.recording_id
    WHERE recording_metas.recording_id IN (SELECT recording_id, meta_key, meta_value FROM recording_metas WHERE meta_key=? AND meta_value=?) LIMIT ?

但为什么会出现以下错误?

Fatal error:  Uncaught Error: Call to a member function bind_param() on bool

$stmt->bind_param(str_repeat('s', count($mixed)), ...$mixed); 这一行,我确信$meta_sql 可以工作,因为我也用其中的 LIMIT 指针单独测试了它,所以如果我在$meta_sql 上使用它们,这些指针工作正常

PHP

function retrieveRecordingsByMetaData($connection, $config, $metas, $limit)
{
    $where = "";
    for ($i = 0; $i < count($metas); $i++) {
        $where .= "meta_key=? AND meta_value=? AND ";
    }
    $where = preg_replace('/ AND $/', '', $where);

    $meta_sql = "SELECT recording_id, meta_key, meta_value FROM $config->meta_table WHERE $where";

    $recording_sql = "SELECT recording FROM $config->recording_table 
    INNER JOIN $config->meta_table 
    ON $config->recording_table.id = $config->meta_table.recording_id
    WHERE $config->meta_table.recording_id IN ($meta_sql) LIMIT ?";

    echo ($recording_sql);

    $stmt = $connection->prepare($recording_sql);

    $mixed = associativeToArrayMixed($metas);
    array_push($mixed, $limit);
    $stmt->bind_param(str_repeat('s', count($mixed)), ...$mixed);

    if (!$stmt->execute()) {
        echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error . " \r\n";
        die();
    }

    $result = $stmt->get_result();
    if ($result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            echo "recording found";
        }
    } else {
        echo "0 results \r\n";
    }
}

【问题讨论】:

  • 你试过var_dump($stmt)吗?
  • 这表明 prepared statement 失败 - fork 逻辑以测试 if ( $stmt ){GOOD} else{BAD}
  • 它输出错误,但我该如何处理这些信息?
  • $stmt = $connection-&gt;prepare($recording_sql);之后马上做
  • 所以出了点问题,实际上用户 nbk 已经回复了您遇到的问题,select 语句必须与您的 where 子句匹配

标签: php mysql select where-clause


【解决方案1】:

您必须在 where 子句中只选择一列

WHERE recording_metas.recording_id IN 
  (SELECT recording_id FROM recording_metas WHERE meta_key=? AND meta_value=?) LIMIT ?

如果您想选择多于一列,您必须使用如下所示的元组 https://stackoverflow.com/a/44706402/5193536

【讨论】:

  • 是的,这是正确的答案,你我的好先生是个聪明人!
猜你喜欢
  • 1970-01-01
  • 2013-01-03
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多