【问题标题】:PHP / mySQL - Query to Retrieve Only Unique Meta ValuesPHP / mySQL - 仅检索唯一元值的查询
【发布时间】:2015-09-24 21:19:36
【问题描述】:

我需要帮助来重写下面的查询以接受第二个和第二个 + 第三个资格。

元键和值示例:

Trees
meta_key = trees
meta_value = pine, oak, sequoia

States
meta_key = states
meta_value = california, washington, florida

Countries
meta_key = countries
meta_value = usa, uk, ireland

我尝试添加这些 AND 语句,但无法使其正常工作。

二级资格:

AND (pm.meta_key = 'states' AND pm.meta_value = 'california')

第二和第三资格:

AND (pm.meta_key = 'states' AND pm.meta_value = 'california')
AND (pm.meta_key = 'countires' AND pm.meta_value = 'usa')

查询功能我需要帮助重写:

function get_unique_post_meta_values( $key = 'trees', $type = 'post', $status = 'publish' ) {
    global $wpdb;
    if( empty( $key ) )
        return;
    $res = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'
", $key, $status, $type ) );
    return $res;
}

提前感谢您的帮助!如果需要进一步说明,请告诉我。

【问题讨论】:

  • 您的第二/第三个资格在同一个查询中?那是不可能的。您不能要求单个字段(例如 pm.meta_key)同时具有两个不同的值。您可以检查多个值集,例如(a and B) OR (c and d)
  • 感谢 Marc 的反馈。我的知识有限,所以评论可以帮助我了解更多。在一般情况下或在函数内的查询构造下是不可能的吗?该查询适用于仅检索“树”的唯一值,但我需要进一步限定和限制检索到的值。我认为这个功能可能是我的解决方案。
  • 如果 meta_value 是一个 3 的数组,它可以工作。您可能有一个元对象数组,其中包括一个 meta_key 和 meta_value 数组。不过,我不记得 PHP 是否像 JavaScript 和 JSON 那样支持它。

标签: php mysql sql wordpress


【解决方案1】:

如果函数设置$key=trees,空检查有什么意义?此外,我认为您缺少大括号。您正在选择“pm.meta_value”,我认为这就是为什么您要进行 LEFT JOIN?也许查看您的数据库结构会帮助我理解这一点,但是您想要的是 INNER JOIN。

if( empty( $key ) ){
 return;
} else {
    $res = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} as p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'
    ", $key, $status, $type ) );
    return $res;
}

试试这个。如果它不起作用,请使用更多详细信息更新此问题,我将帮助您进一步指导。

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多