web-dev-qa-db-ja.com

SQL:次のクエリの間違いは何ですか(WordPress WP_Queryによって生成され、注文価格)

ちょっとそこに私はWP_Query数値メタクエリによって生成される以下のSQLクエリを持っています:

SELECT SQL_CALC_FOUND_ROWS wp_postmeta.meta_value FROM wp_posts 
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) 
INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id ) 
WHERE 1=1 
AND ( wp_postmeta.meta_key = 'price' 
AND ( mt1.meta_key = 'price' 
AND CAST(mt1.meta_value AS SIGNED) BETWEEN '0' AND '9999' ) ) 
AND wp_posts.post_type = 'product' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID ORDER BY CAST(wp_postmeta.meta_value AS SIGNED) DESC LIMIT 0, 15

WordPressの問い合わせ - もしそれが助けになるなら - はこのように生成され、それは正しいはずです:

array(6) {
  ["orderby"]=>
  array(1) {
    ["price"]=>
    string(4) "DESC"
  }
  ["meta_query"]=>
  array(3) {
    ["relation"]=>
    string(3) "AND"
    ["sortprimary_clause"]=>
    array(3) {
      ["key"]=>
      string(17) "price"
      ["compare"]=>
      string(6) "EXISTS"
      ["type"]=>
      string(7) "numeric"
    }
    [0]=>
    array(4) {
      ["key"]=>
      string(17) "price"
      ["value"]=>
      array(2) {
        [0]=>
        float(0)
        [1]=>
        float(9999)
      }
      ["compare"]=>
      string(7) "BETWEEN"
      ["type"]=>
      string(7) "numeric"
    }
  }
  ["tax_query"]=>
  array(1) {
    ["relation"]=>
    string(3) "AND"
  }
  ["post_type"]=>
  string(7) "product"
  ["posts_per_page"]=>
  int(15)
  ["paged"]=>
  string(1) "1"
}

結果は次のとおりです。

Query result

ご覧のとおり、SQLは基本的に正しい値を順序付けていますが、INTEGERサイズの価格でのみです。小数点記号は完全に無視されるようです。浮動小数点数で正しく動作するようにSQLを変更する方法を教えてください。それはWordPressの問題ですか、それとも浮動小数点数を正しく扱えるようにWP_Queryを変更することができますか?

編集:私は問題を見つけました! ORDER BY CAST(wp_postmeta.meta_value AS SIGNED)ORDER BY CAST(wp_postmeta.meta_value AS DECIMAL(M,3))であるべきです。

WP_Queryを比較のためにIntegerではなく10進値を使うように変更するにはどうすればよいですか?

1
Blackbam

解決しました。編集後は簡単でした。 meta_queryではtype => 'decimal(x、x)'を使用できます。最大精度は10進数(65,30)です。

https://dev.mysql.com/doc/refman/5.7/ja/precision-math-decimal-characteristics.html

array(6) {
  ["orderby"]=>
  array(2) {
    ["uss_product_price"]=>
    string(4) "DESC"
    ["title"]=>
    string(3) "ASC"
  }
  ["meta_query"]=>
  array(3) {
    ["relation"]=>
    string(3) "AND"
    ["sortprimary_clause"]=>
    array(3) {
      ["key"]=>
      string(17) "price"
      ["compare"]=>
      string(6) "EXISTS"
      ["type"]=>
      string(13) "decimal(30,5)"
    }
    [0]=>
    array(4) {
      ["key"]=>
      string(17) "price"
      ["value"]=>
      array(2) {
        [0]=>
        float(0)
        [1]=>
        float(9999)
      }
      ["compare"]=>
      string(7) "BETWEEN"
      ["type"]=>
      string(7) "decimal(30,5)"
    }
  }
  ["tax_query"]=>
  array(1) {
    ["relation"]=>
    string(3) "AND"
  }
  ["post_type"]=>
  string(7) "product"
  ["posts_per_page"]=>
  int(15)
  ["paged"]=>
  string(1) "2"
}
1
Blackbam