2016-03-29 4 views
2

Я пытаюсь создать пользовательский запрос для получения сообщений (они действительно являются продуктами) из wordpress, где не имеют мета-запроса с именем 'custom_code'. Пытаюсь:выберите ... где не существует

SELECT DISTINCT p.ID 
FROM 
    wp_posts p 
LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id 
WHERE 
    p.post_type = 'product' 
AND (p.post_status = 'publish' OR p.post_status = 'draft') 
AND pm.meta_key = 'custom_code' AND pm.meta_key IS NULL 

Я попытался с NOT EXISTS, но SQL возвращает ошибку:

SELECT DISTINCT p.ID 
FROM 
    wp_posts p 
LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id 
WHERE 
    p.post_type = 'product' 
AND (p.post_status = 'publish' OR p.post_status = 'draft') 
AND NOT EXISTS (
    select * from wp_postmeta as pm2 
    where pm2.meta_key = 'custom_code' 
) 

ПРИМЕЧАНИЕ: Мне нужно получить такие сообщения со статусом «публиковать» как должности со статусом «черновик ».

ОШИБКА возвращается:

слова непризнанного. (Рядом с "NOT", в позиции 193)

Ключевое слово непризнанное. (Рядом с "EXISTS", в позиции 197)

Символ (токен) неожиданно. (Near «(» в положении 204)

ТОК POINT

я сделал с WordPress API, и это работает, но мне нужно, чтобы добавить LEFT JOIN также получить продукты с именем, как имя каждого . продукт, возвращаемый предложения ниже Это предложение:

$args = array(
    'posts_per_page' => -1, 
    'post_type'  =>'product', 
    'post_status'  => 'publish,draft', 
    'meta_query' => array(
       array(
       'key' => 'custom_code', 
       'compare' => 'NOT EXISTS' 
      )), 
); 
$posts_array = get_posts($args); 

Любая помощь заранее спасибо

+1

Изменить ГДЕ К И. Измените окончательный AND на WHERE. – Strawberry

+1

Ну meta_key не может быть и «custom_code» * AND * NULL. Вы должны добавить сообщение об ошибке, которое вы наблюдаете. –

+0

Я отредактировал мое сообщение. –

ответ

1

Вы пробовали что-то вроде этого

$args = array(
    'posts_per_page' => -1, 
    'post_type'  =>'product', 
    'post_status'  => 'publish,draft', 
    'meta_query' => array(
       array(
       'key' => 'custom_code', 
       'compare' => 'NOT EXISTS' 
      )), 
); 
$posts_array = get_posts($args); 

var_dump($posts_array); 

ПРИМЕЧАНИЕ

Используйте этот код для печати Query

global $wpdb; 
var_dump($wpdb->last_query); 
+0

Да, я сделал, и все работает отлично, но мне нужно будет в sql-коде, чтобы добавить левое соединение, чтобы также получить продукты с именем, как имя каждого продукта, возвращенного wihich не имеет custom_code –

+1

Plesae проверить мой обновленный код @DanielGarciaSanchez –

1

Это, как может быть запрос с NOT EXITSTS:.

SELECT DISTINCT p.ID 
FROM wp_posts AS p 
WHERE p.post_type = 'product' AND 
     p.post_status ΙΝ ('publish', 'draft') AND 
     NOT EXISTS (select * 
        from wp_postmeta as pm 
        where p.ID = pm.post_id AND 
         pm.meta_key = 'custom_code') 

или, используя LEFT JOIN:

SELECT DISTINCT p.ID 
FROM wp_posts AS p 
LEFT JOIN wp_postmeta AS pm 
    ON p.ID = pm.post_id AND pm.meta_key = 'custom_code' 
WHERE p.post_type = 'product' AND 
     p.post_status ΙΝ ('publish', 'draft') AND 
     pm.post_id IS NULL  
+0

Я пробовал ваше предложение NOT EXITSTS, но sql возвращает мне ошибку, которую я добавил в свой пост. –

+0

@DanielGarciaSanchez Запрос синтаксически корректен, насколько я могу видеть. –

Смежные вопросы