web-dev-qa-db-ja.com

複数のメタキー値を問い合わせる

同じキーを持つ複数のメタキー値を問い合わせる方法

$querystr = "  
            SELECT $wpdb->posts.* 
            FROM $wpdb->posts, $wpdb->postmeta
            WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 

            AND $wpdb->postmeta.meta_key = 'key1'   
            AND $wpdb->postmeta.meta_value = 'value1'
            // why doesn't this work?
            AND $wpdb->postmeta.meta_value = 'value2'

            AND $wpdb->posts.post_status = 'publish' 
            AND $wpdb->posts.post_type = 'post'
            ORDER BY $wpdb->posts.post_date DESC
                ";

次のコード

<?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
// this array results in no return for both arrays
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$the_query  = new WP_Query( $args );
 ?>

                <?php /* Start the Loop */ ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

                    <?php get_template_part( 'content', get_post_format() ); ?>

                <?php endwhile; ?>
22
steen

ここでAND/OR混乱が起こっているような気がします。

OPのクエリは、 both key1 = 'value1' AND key2 = 'value2'の投稿のみを返します。ほとんどのWPプラグイン(とにかく私が知っている)は、同じキーを使って同じ投稿に対して複数の値をpostmetaに保存しません。

欲しいものが本当にORである場合(key1 = 'value1'の投稿とkey1 = 'value2'の投稿を取得したい場合)、@ WhiskerSandwichの答えを 'INを使ってご覧ください'およびvalueパラメーターの値の配列。

あるいは、relationパラメータを `meta_query 'に与えることもできます。

$args = array(
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),

        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);

同じキーを使用する複数のメタクエリの関係としてORを使用することは、INと単一の値に値の配列を使用することと機能的に同等です。

31
Boone Gorges

同じキーに複数の配列を渡してもうまくいかないという同じ問題がありました。代わりに、1つの配列を使用し、 'value'を値の配列に設定し、 'compare'をINに設定してください。

<?php

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => array('value1', 'value2'),
            'compare' => 'IN'
        ),
    )
);
$query = new WP_Query( $args );

?>
14
WhiskerSandwich

2番目の値にpostmetaテーブルをエイリアスする必要があります。

$querystr = "  
        SELECT $wpdb->posts.* 
        FROM $wpdb->posts, $wpdb->postmeta, $wpdb->postmeta AS mt1
        WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 

        AND $wpdb->postmeta.meta_key = 'key1'   
        AND $wpdb->postmeta.meta_value = 'value1'
        AND mt1.meta_key = 'key1'
        AND mt1.meta_value = 'value2'

        AND $wpdb->posts.post_status = 'publish' 
        AND $wpdb->posts.post_type = 'post'
        ORDER BY $wpdb->posts.post_date DESC
            ";

また、3.1から meta_query を使ってこれを行うこともできます。

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$query = new WP_Query( $args );
1
Milo

キーはkey1で、値 'value1'と 'value2'は、21との新規インストールでテキストと数値の両方を試しました。 print_r($ the_query); works出力は正常に見えます。 key1とkey2を試しても動作しません。私はそれを1つのアレイに限定するとすぐにそれは働きます。別のブラウザで確認しました。

しかしこれはうまくいきます。

    <?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'wtf',
            'value' => '1',
            'compare' => '>='
        ),
// this array results in no return for both arrays
        array(
            'key' => 'wtf',
            'value' => '2',
            'compare' => '<='
        )
    )
);
$the_query  = new WP_Query( $args );

 ?>
0
steen