2016-03-29 7 views
2

Ich versuche eine benutzerdefinierte Abfrage zu machen, um Beiträge (sie sind wirklich Produkte) von WordPress, wo haben keine Meta-Abfrage mit dem Namen 'custom_code'. Ich versuche:auswählen ... wo nicht existiert

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 

Ich habe versucht, mit NICHT VORHANDEN, aber SQL gibt Fehler:

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' 
) 

HINWEIS: Ich muss solche Stellen mit dem Status ‚Veröffentlichen‘ als Beiträge mit dem Status ‚Entwurf erhalten ".

ERROR zurückgegeben:

Stichwort unerkannt. (Nahe "NICHT", bei Position 193)

Schlüsselwort nicht erkannt. (Nahe "EXISTS", an Position 197)

Symbol (Token) unerwartet. (Near "(" an Position 204)

CURRENT POINT

ich mit Wordpress API tat, und es funktioniert, aber ich brauche eine LEFT hinzuzufügen JOIN auch Produkte erhalten mit Namen wie der Name jeder . Produkt von Satz zurück unten Dies ist der Satz:

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

Jede Hilfe Vielen Dank im Voraus

+1

Ändern Sie WHERE zu AND. Ändern Sie das endgültige UND in WHERE. – Strawberry

+1

Well Meta-Schlüssel kann nicht sowohl 'custom_code' * UND * NULL sein. Sie sollten die Fehlermeldung hinzufügen, die Sie beobachten. –

+0

Ich habe meinen Beitrag bearbeitet. –

Antwort

1

Haben Sie so etwas wie dieses

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

HINWEIS

verwenden Code-Abfrage

zu drucken versucht 210
global $wpdb; 
var_dump($wpdb->last_query); 
+0

ja, tat ich, und es funktioniert gut, aber ich würde in SQL-Code benötigen, um einen linken Join hinzuzufügen, um auch Produkte mit Namen wie Name jedes Produkts zurückgegeben, die nicht custom_code –

+1

Plesae überprüfen Sie meinen aktualisierten Code @DanielGarciaSanchez –

1

Dies ist, wie eine Abfrage mit NOT EXITSTS sein könnte.

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') 

oder unter Verwendung von 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

Ich habe versucht, Ihren Satz nicht EXITSTS, aber sql gibt mir den Fehler, den ich in meinem Beitrag hinzugefügt. –

+0

@DanielGarciaSanchez Die Abfrage ist syntaktisch korrekt, soweit ich sehen kann. –