PHP with SQL-在WHERE子句中的字段上运行PHP函数,然后再与LIKE进行比较

PHP with SQL-在WHERE子句中的字段上运行PHP函数,然后再与LIKE进行比较,php,mysql,sql,wordpress,Php,Mysql,Sql,Wordpress,我在MySQL中使用Wordpress/Woocommerce。 我需要找到与给定电话相同的所有订单。 下面是基本的SQL语句。问题是,当电话号码存储在数据库中时,它们没有被规范化,因此存在所有可能的形式,如0YZ abcd,0YZabcd,+KMYZabcs,等等 我已经有了一个PHP函数来规范任何电话号码。我的问题是如何将该函数应用于WHERE子句中考虑的每一行的_billing_phone列 原始SQL是 $canonized_phone_to_compare_to = canonize

我在MySQL中使用Wordpress/Woocommerce。 我需要找到与给定电话相同的所有订单。 下面是基本的SQL语句。问题是,当电话号码存储在数据库中时,它们没有被规范化,因此存在所有可能的形式,如
0YZ abcd
0YZabcd
+KMYZabcs
,等等 我已经有了一个PHP函数来规范任何电话号码。我的问题是如何将该函数应用于WHERE子句中考虑的每一行的_billing_phone列

原始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 . "'      
" );
我需要的是找到一种方法,在比较之前将
规范化\u phone\u number()
应用于
pm.meta\u值。换句话说,每次SQL“检查”pm.meta_值是否等于$canonized_phone_to_compare_to,我希望SQL将我的函数(或者存储过程?)应用于pm.meta_值并重新格式化该字段


或者其他方法来解决这个问题?

您不能在正在运行的SQL查询中运行PHP函数。我认为最好是以通用格式存储它们

根据数据的存储方式,您可以使用它来消除空格和减号。然后使用函数从您的电话号码中获取最后一部分。我不建议这样做,因为您将无法编制索引,并且查询可能会变慢。(MySQL的新版本并非如此。)

例如,在瑞典,所有手机号码看起来都像07z xxx xx、00467z xxx xx、+467z-XXXXXX、+46(0)7z xx xx xx xxx。 在这种情况下,您可以将所有空格和减号替换为零,然后匹配最后7位数字


所有国家都有自己的编号计划,因此您必须检查文档中的数据。

您不能在正在运行的SQL查询中运行PHP函数。我认为最好是以通用格式存储它们

根据数据的存储方式,您可以使用它来消除空格和减号。然后使用函数从您的电话号码中获取最后一部分。我不建议这样做,因为您将无法编制索引,并且查询可能会变慢。(MySQL的新版本并非如此。)

例如,在瑞典,所有手机号码看起来都像07z xxx xx、00467z xxx xx、+467z-XXXXXX、+46(0)7z xx xx xx xxx。 在这种情况下,您可以将所有空格和减号替换为零,然后匹配最后7位数字


所有国家都有自己的编号计划,因此您必须检查文档中的数据。

我不确定是否使用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];
    }
}

我不确定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];
    }
}

@ag谢谢,但在我的用例中,这将是非常缓慢的。此查询每次将获取数千个数字,并在用户每次打开站点的orders admin页面时运行数千次。如果这里没有好的答案,我将在数据库中创建一个存储过程probably@LouisShraga我认为解决这个问题的最好方法就是进行更新查询。将所有数字更改为一种格式,这样就很容易使用了。@AbolfaziGhaemi-是的,不仅如此,我还需要确保所有新条目在存储之前也采用相同的格式。。。也许这就是我要说的do@ag谢谢,但在我的用例中,这将是非常缓慢的。此查询每次将获取数千个数字,并在用户每次打开站点的orders admin页面时运行数千次。如果这里没有好的答案,我将在数据库中创建一个存储过程probably@LouisShraga我认为解决这个问题的最好方法就是进行更新查询。将所有数字更改为一种格式,这样就很容易使用了。@AbolfaziGhaemi-是的,不仅如此,我还需要确保所有新条目在存储之前也采用相同的格式。。。也许这就是我要记录的,请你详细说明一下你的“你将无法索引,查询可能会变慢”。在哪种情况下是这样,为什么?你的意思是如果我替换数据库中的数字会发生这种情况吗?谢天谢地,在新版本中,您可以使用功能键进行索引。请看。这只意味着如果你不想转换所有现有的和未来的数字。@mikaelwallgren-有一个函数作为它们的键是一个很酷的信息,可以为我发现有关MySQL的信息,谢谢!不幸的是,由于DB“属于”WordPress实例,我不确定我是否会/能够更改这些内容。但我想更好地理解你的答案。您在本段开头建议用重新格式化的数据替换现有数据。在这种情况下,我为什么需要功能键?由于我正在考虑去替换所有数据,我担心我错过了与您所说的相关的内容。如果您将数据替换为通用格式,您将不需要功能键索引。请您详细说明一下“您将无法索引,查询可能会变慢”。在哪种情况下是这样,为什么?你的意思是如果我替换数据库中的数字会发生这种情况吗?谢天谢地,在新版本中,您可以使用功能键进行索引。请看。这只意味着如果你不想转换所有现有的和未来的数字。@mikaelwallgren-有一个函数作为它们的键是一个很酷的信息,可以为我发现有关MySQL的信息,谢谢!不幸的是,由于DB“属于”WordPress实例,我不确定我是否会/能够更改这些内容。但我想更好地理解你的答案。您在本段开头建议用重新格式化的数据替换现有数据。在这种情况下,我为什么需要功能键?因为我正在考虑去回复