web-dev-qa-db-fra.com

SQL: Quel est le problème avec la requête suivante (généré par WordPress WP_Query, prix de commande)

Hé là j'ai la requête SQL suivante qui est générée par la méta requête numérique WP_Query:

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

La requête WordPress - si cela aide - est générée comme ceci et devrait être correcte:

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"
}

Le résultat est le suivant:

Query result

Comme vous pouvez le constater, SQL commande les valeurs BASICALLY correctes, mais uniquement dans la taille INTEGER des prix. Le séparateur décimal semble être complètement ignoré. Comment puis-je modifier le code SQL afin de fonctionner correctement avec des nombres à virgule flottante. Est-ce un problème WordPress ou puis-je changer WP_Query pour qu'il fonctionne correctement avec les nombres à virgule flottante?

EDIT: j'ai trouvé le problème! ORDER BY CAST(wp_postmeta.meta_value AS SIGNED) devrait être ORDER BY CAST(wp_postmeta.meta_value AS DECIMAL(M,3)).

La question est donc la suivante: Comment puis-je changer WP_Query pour utiliser une valeur décimale à des fins de comparaison au lieu d’Integer?

1
Blackbam

Résolu Après l'édition, c'était facile. Il est permis d'utiliser le type => 'décimal (x, x)' dans meta_query. La précision maximale est décimale (65,30).

https://dev.mysql.com/doc/refman/5.7/en/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