Металлическое поле запроса с использованием

Я пытаюсь запросить некоторую рельефность и логичность, а затем я получаю несколько длинных чисел, и, похоже, Query не нравится.

Пусть говорит, что у меня есть данные в базе данных

Meta-key: lat Meta-value: 54.3415000 Meta-key: lng Meta-value: 10.1254100 

и выполните запрос следующим образом:

 $args['meta_query'] = array( 'relation' => 'AND', array( 'key' => 'lat', 'value' => array( '53.82659686199116', '54.946076335668714' ), 'type' => 'NUMERIC', 'compare' => 'BETWEEN', ), array( 'key' => 'lng', 'value' => array( '8.429260683593725', '11.889954042968725' ), 'type' => 'NUMERIC', 'compare' => 'BETWEEN', ) ); 

Затем он работает, НО , когда это выглядит так:

 $args['meta_query'] = array( 'relation' => 'AND', array( 'key' => 'lat', 'value' => array( '54.10933293482647', '54.66906633195788' ), 'type' => 'NUMERIC', 'compare' => 'BETWEEN', ), array( 'key' => 'lng', 'value' => array( '9.294434023437475', '11.024780703124975' ), 'type' => 'NUMERIC', 'compare' => 'BETWEEN', ) ); 

Тогда это не сработает, даже если это еще между двумя цифрами.

Кто-нибудь знает, что здесь происходит? Должен быть какой-то материал MYSQL.

РЕДАКТИРОВАТЬ:

Вот как выглядит запрос mysql:

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 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_posts.post_type = 'branchenbuch' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future' OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' OR wp_posts.post_status = 'private') AND ( (wp_postmeta.meta_key = 'lat' AND CAST(wp_postmeta.meta_value AS SIGNED) BETWEEN '54.1833340338' AND '54.4636527622')AND (mt1.meta_key = 'lng' AND CAST(mt1.meta_value AS SIGNED) BETWEEN '9.76272625977' AND '10.6278995996') ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10 

Solutions Collecting From Web of "Металлическое поле запроса с использованием"

Ваша проблема заключается в следующем:

 CAST(wp_postmeta.meta_value AS SIGNED) 

Запустите простой SQL-запрос (командная строка или PhpMyAdmin, как вам нравится), например SELECT CAST('1.2' as SIGNED) и вы увидите, что возвращаемое значение равно 1 . Что вызывает то, что cast – 'type' => 'NUMERIC',

Вы можете передать meta_query в meta_query вместо NUMERIC но я не вижу способа передать параметры DECIMAL , которые фактически сделают его полезным. SELECT CAST('1.2' as DECIMAL) также равно 1 если вы также не передаете аргументы DECIMAL как этот SELECT CAST('1.2' as DECIMAL(20,10)) . Первое число – «точность» – количество десятичных знаков, используемых в математике, а второе – число возвращаемых десятичных знаков. Второй мне кажется, что второе значение должно быть как минимум на 2 меньше первого, или вы получаете нечетные вопросы округления. Очевидно, что второе должно быть больше или больше максимального десятичного знака в вашем номере.

Ваш лучший подход – использовать 'type' => 'DECIMAL', и применить фильтр:

 function add_decimal_params($sqlarr) { remove_filter('get_meta_sql','add_decimal_params'); $sqlarr['where'] = str_replace('DECIMAL','DECIMAL(20,16)',$sqlarr['where']); return $sqlarr; } add_filter('get_meta_sql','add_decimal_params'); 

Добавьте фильтр непосредственно перед запросом и удалите его.

Возможно, вы сможете заставить это работать, оставив ваши номера на одинаковой длине и не используя аргумент type вообще, но я не тестировал это.

Я использовал что-то подобное пару лет назад, я, наконец, использовал raw sql (не могу вспомнить, почему), но основное отличие, которое я вижу от вашего сырого sql и моего, – это эта строка:

 AND CAST(wp_postmeta.meta_value AS SIGNED) BETWEEN '54.1833340338' 

в моем случае он отбрасывается в DECIMEL, а значения – это числа (не строки):

 AND CAST(wp_postmeta.meta_value AS DECIMAL(20,10)) BETWEEN 54.1833340338 

и фактические lat / lng не имеют одинарных кавычек -> поэтому они являются фактическими числами.

Попробуйте запустить это:

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 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_posts.post_type = 'branchenbuch' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future' OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' OR wp_posts.post_status = 'private') AND ( (wp_postmeta.meta_key = 'lat' AND CAST(wp_postmeta.meta_value AS DECIMAL(20,10)) BETWEEN 54.1833340338 AND 54.4636527622) AND (mt1.meta_key = 'lng' AND CAST(mt1.meta_value AS DECIMAL(20,10)) BETWEEN 9.76272625977 AND 10.6278995996)) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10