SELECT 上的 WordPress 子查询 returns 多于 1 行

WordPress Subquery returns more than 1 row on SELECT

我正在通过自定义 Wordpress 插件使用核心 cron 执行此查询:

// MAKE SQL CALL
    $SQL = "SELECT ".$wpdb->prefix."postmeta.post_id FROM ".$wpdb->prefix."postmeta
    INNER JOIN ".$wpdb->prefix."posts ON (".$wpdb->prefix."posts.ID = ".$wpdb->prefix."postmeta.post_id )       
     WHERE ".$wpdb->prefix."postmeta.meta_key = '".$core_admin_values['listing_expiration']['key']."' 
     AND ".$wpdb->prefix."posts.post_status = 'publish'
     AND ".$wpdb->prefix."postmeta.post_id = (SELECT ".$wpdb->prefix."postmeta.post_id FROM ".$wpdb->prefix."postmeta WHERE ".$wpdb->prefix."postmeta.meta_key = 'listing_status' AND ".$wpdb->prefix."postmeta.meta_value != 1)
     AND ".$wpdb->prefix."posts.post_type = '".$core_admin_values['listing_expiration']['taxonomy']."_type'
     AND DATE(".$wpdb->prefix."postmeta.meta_value) < DATE(NOW())";     
    $expired_listings = (array)$wpdb->get_results($SQL);

但是return这个错误:

FastCGI sent in stderr: "PHP message: Database error of WordPress Subquery returns more than 1 row for SELECT

如何解决这个问题?我在 Stack here 尝试了一些类似问题的解决方案,但仍然失败。

尝试在子查询

上添加LIMIT

// 进行 SQL 呼叫

 $SQL = "SELECT ".$wpdb->prefix."postmeta.post_id FROM ".$wpdb->prefix."postmeta
    INNER JOIN ".$wpdb->prefix."posts ON (".$wpdb->prefix."posts.ID = ".$wpdb->prefix."postmeta.post_id )       
     WHERE ".$wpdb->prefix."postmeta.meta_key = '".$core_admin_values['listing_expiration']['key']."' 
     AND ".$wpdb->prefix."posts.post_status = 'publish'
     AND ".$wpdb->prefix."postmeta.post_id = (SELECT ".$wpdb->prefix."postmeta.post_id FROM ".$wpdb->prefix."postmeta WHERE ".$wpdb->prefix."postmeta.meta_key = 'listing_status' AND ".$wpdb->prefix."postmeta.meta_value != 1 LIMIT 1)
     AND ".$wpdb->prefix."posts.post_type = '".$core_admin_values['listing_expiration']['taxonomy']."_type'
     AND DATE(".$wpdb->prefix."postmeta.meta_value) < DATE(NOW())";     
    $expired_listings = (array)$wpdb->get_results($SQL);

为了便于阅读,我重新格式化了您的查询。

SELECT 
  postmeta.post_id 
FROM 
  postmeta
  INNER JOIN posts 
    ON (posts.ID = postmeta.post_id )       
WHERE 
  postmeta.meta_key = '".$core_admin_values['listing_expiration']['key']."' 
  AND posts.post_status = 'publish'
  AND postmeta.post_id = 
  (
      SELECT 
        postmeta.post_id 
      FROM 
        postmeta 
      WHERE 
        postmeta.meta_key = 'listing_status' 
        AND postmeta.meta_value != 1
  )
  AND posts.post_type = '".$core_admin_values['listing_expiration']['taxonomy']."_type'
  AND DATE(postmeta.meta_value) < DATE(NOW())";     

我怀疑您的问题源于 where 子句中的子查询。

      SELECT 
        postmeta.post_id 
      FROM 
        postmeta 
      WHERE 
        postmeta.meta_key = 'listing_status' 
        AND postmeta.meta_value != 1

而且这个块返回了不止一个结果。如果您想匹配多个结果,请将“=”更改为 "in",如下所示:

  AND postmeta.post_id in
  (
      SELECT 
        postmeta.post_id ...
  )

几年后出现了类似的问题,但是,就我而言,我无法找到进行更改的查询,因此,我决定删除警告消息(因为它只是一个警告)和我使用的方法是将此行添加到 wp-config.php 文件:

ini_set('display_errors','Off');
ini_set('error_reporting', E_ALL );
define('WP_DEBUG', false);
define('WP_DEBUG_DISPLAY', false);

此致!