首页 文章

WordPress子查询在SELECT上返回多行

提问于
浏览
0

我通过自定义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);

但是返回此错误:

在stderr中发送的FastCGI:“PHP消息:WordPress子查询的数据库错误为SELECT返回多行

怎么解决这个?我在Stack中尝试了类似问题的一些解决方案,但它仍然失败了 .

2 回答

  • 0

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

    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 ...
      )
    
  • 0

    尝试在子查询上添加 LIMIT

    // 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 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);
    

相关问题