PHP с SQL - запустить функцию php для поля в предложении WHERE, прежде чем его сравнивать с LIKE - PullRequest
0 голосов
/ 27 апреля 2020

Я использую Wordpress / Woocommerce с MySQL. Мне нужно найти все заказы с тем же биллинговым телефоном, что и данный. Основа c SQL ниже. Проблема в том, что когда телефонные номера хранились в БД, они не были канонизированы, и поэтому есть все возможные формы, такие как 0YZ-abcd, 0YZabcd, +KMYZabcs и т. Д. У меня уже есть функция PHP для канонизации любого телефона. число. У меня вопрос, как применить эту функцию к столбцу _billing_phone каждой строки, который рассматривается в предложении WHERE.

Оригинальный SQL равен

 $canonized_phone_to_compare_to = canonize_phone_number($original_phone_number);

 $results = $wpdb->get_col( "
    SELECT p.ID FROM {$wpdb->prefix}posts AS p
    INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
    WHERE pm.meta_key = '_billing_phone' 
    AND pm.meta_value = '" . $canonized_phone_to_compare_to . "'      
" );

Что Мне нужно найти способ применить canonize_phone_number() к pm.meta_value непосредственно перед сравнением. Другими словами, каждый раз SQL 'проверяет', равняется ли pm.meta_value $ canonized_phone_to_compare_to Я хочу, чтобы SQL применил мою функцию (или, может быть, хранимую процедуру?) К pm.meta_value и переформатировал это поле

Или как-то иначе?

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Я не уверен насчет SQL, но вы всегда можете сделать это за PHP. так что попробуйте получить столбцы без последней части.

конечно, есть лучший способ сделать это, но я думаю, что это сработает.

$canonized_phone_to_compare_to = "0xxxxxxxxxx";
$results = $wpdb->get_col("
    SELECT p.ID FROM {$wpdb->prefix}posts AS p
    INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
    WHERE pm.meta_key = '_billing_phone'   
 ");
foreach ($results as $i => $v) {
    $results[$i]['pm.meta_value'] = canonize_phone_number($results[$i]['pm.meta_value']);
    if ($canonized_phone_to_compare_to == $results[$i]['pm.meta_value']) {
        $newResults[] = $results[$i];
    }
}
1 голос
/ 27 апреля 2020

Вы не можете запустить PHP функцию в запущенном SQL -запросе. Я думаю, что было бы лучше, если бы вы хранили их в универсальном формате.

В зависимости от того, как хранятся ваши данные, вы можете использовать replace , чтобы избавиться от пробелов и знака минус. , Затем используйте функцию right , чтобы получить последнюю часть из ваших телефонных номеров. Я не рекомендую это, потому что вы не сможете индексировать, и запрос может стать медленным. (Это не относится к более новым версиям MySQL.)

Например, в Швеции все мобильные номера выглядят так: 07z-xxx xx xx, 00467z-xxx xx xx, + 467z-xxxxxxx, + 46 (0) 7z-xx xx xxx. В этом случае вы можете заменить все пробелы и знак минус ничем, а затем сопоставить их с последними 7 цифрами.

Во всех странах есть план нумерации, поэтому вы должны проверить документацию для своих данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...