2016-04-14 3 views
0

Я выполнение этого запроса с основными хронами обычаем Wordpress плагин:WordPress подзапрос возвращает более чем на 1 строку на SELECT,

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

Но вернуть эту ошибку:

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

Как решить эту проблему? Я попробовал некоторые решения по аналогичным проблемам здесь, в Stack, но он все еще терпит неудачу.

+0

Просьба предоставить ссылки на решения, которые вы пробовали. –

ответ

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 

И этот кусок возвращает более одного результата. Если вы хотите сопоставить более одного результата, измените их с «=» на «в» следующим образом:

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

Hi Beardo. Спасибо за совет. Простая, полная и идеально решаемая проблема. – user3416348

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); 
Смежные вопросы