web-dev-qa-db-ja.com

mySQLクエリmeta_keyによる注文

もうかなり長い間戦っていて、大きなものが足りないと思っています。 CPT投稿にはメタデータがある場合とない場合があります(_vip_post [0|1]_thumbnail_id [null|numeric])。

私が_thumbnail_idを問い合わせるならば、それは大丈夫です、そして、働きます:

SELECT SQL_CALC_FOUND_ROWS wp_posts.* 
FROM wp_posts  
LEFT JOIN wp_postmeta m ON ( wp_posts.ID = m.post_id AND m.meta_key = '_thumbnail_id')
ORDER BY 
    m.meta_key DESC,
    wp_posts.post_date DESC

サムネイル付きの投稿を最初に返します。最後に_thumbnail_id = nullが続きます。今のところ十分です。ワーキング。

しかし、もし私が私の新しい_vip_post meta_keyを問い合わせるならば、それは順序付けにおいて完全に無視されます。同じパターン.

SELECT SQL_CALC_FOUND_ROWS wp_posts.* 
FROM wp_posts  
LEFT JOIN wp_postmeta m ON ( wp_posts.ID = m.post_id AND m.meta_key = '_vip_post')
ORDER BY 
    m.meta_key DESC,
    wp_posts.post_date DESC 

post_dateの順に並んでいるだけです。動作していません。

1
Zlatev

ズラテフ

meta_keyはカスタム投稿タイプの名前で、VARCHAR(255)です。
meta_valueはキーの値であり、ロングテキストです。

クエリでは、値ではなくフィールドの名前で並べ替えています。 LEFT JOINを使用していてCPTがnullになる可能性があるため、クエリは_thumbnail_idに対して機能します。

このクエリを実行したかどうかがわかります

SELECT SQL_CALC_FOUND_ROWS wp_posts.* ,m.*
FROM wp_posts  
LEFT JOIN wp_postmeta m ON ( wp_posts.ID = m.post_id AND m.meta_key = '_thumbnail_id')
ORDER BY 
    m.meta_key ASC,
    wp_posts.post_date DESC

Meta_keyのnullを参照してください。

2番目のケースでは、CPTの_vip_post ISが常に存在するため、フィールド名の順序付けは機能しません。 meta_valueで並べる必要があります。

次のようにしてください。

SELECT SQL_CALC_FOUND_ROWS wp_posts.* ,m.*
FROM wp_posts  
LEFT JOIN wp_postmeta m ON ( wp_posts.ID = m.post_id AND m.meta_key = '_vip_post')
ORDER BY 
    m.meta_value ASC,
    wp_posts.post_date DESC

* m.meta_value DESC *を使用して順序を変更できます。

4
keatch