Wordpress - 两个自定义字段问题的SQL查询

时间:2010-10-26 17:46:13

标签: php sql wordpress left-join custom-fields

到目前为止我有这个问题:


if(!empty($_SESSION['s_property_region'])) {
    $sqlWHERE .= " AND $wpdb->postmeta.meta_key = 'property_region' AND $wpdb->postmeta.meta_value = '".$_SESSION['s_property_region']."'";
}
if(!empty($_SESSION['s_property_bedrooms'])) {
    $sqlWHERE .= " AND $wpdb->postmeta.meta_key = 'property_bedrooms' AND $wpdb->postmeta.meta_value = '".$_SESSION['s_property_bedrooms']."'";
}
$sql    =   "SELECT $wpdb->posts.ID
             FROM $wpdb->posts
             LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
             WHERE $wpdb->posts.post_status = 'publish'
             AND $wpdb->posts.post_type = 'property'
             ".$sqlWHERE."
             ORDER BY $wpdb->posts.post_date DESC";

如果我只是搜索一个自定义字段而不是一起搜索两个字段,则它可以工作。我知道为什么和它因为LEFT Join的工作方式。不会有一行post_type可以同时出现两件事。

在加入之后我将得到这样的结构:

|   ID   |   meta_key          |   meta_value   |
|   1    |   property_region   |   East         |
|   1    |   property_bedrooms |   4            |
|   2    |   property_region   |   West         |
|   2    |   property_bedrooms |   2            |

是否有一个查询可以将两个表转换为这样的结构:

|   ID   |   property_region   |   property_bedrooms   |
|   1    |   East              |   4                   |
|   2    |   West              |   2                   |

如果查询可以使表格看起来像上面那么我的简单WHERE这= = AND this =将起作用。

非常感谢任何有关此事的帮助

由于

斯科特

编辑:经过一些搜索我现在把这段代码放在一起:http://pastebin.com/5YYDLyeR它工作并返回我之后的结构但是当我尝试在property_region和property_bedrooms上做一个WHERE我得到:#1054 - 'where子句'中的未知列'property_bedrooms'

EDIT2:好的我已经接受了PMV代码并能够执行我的WHERE子句我必须做一个子查询:http://pastebin.com/dvTgsU7S这段代码做了我想要的但是有没有更好的方法来实现这个查询?我认为当我在DB中有1000多个条目时,性能将成为一个问题...

1 个答案:

答案 0 :(得分:1)

将整个查询提取为以下内容:

SELECT ID
,      MAX(CASE WHEN meta_key = 'property_region' THEN meta_value END) AS property_region
,      MAX(CASE WHEN meta_key = 'property_bedrooms' THEN meta_value END) AS property_bedrooms
FROM (your query)
GROUP BY ID
HAVING MAX(CASE WHEN meta_key = 'property_region' THEN meta_value END) = 'east'
AND    MAX(CASE WHEN meta_key = 'property_bedrooms' THEN meta_value END) = 4

编辑:HAVING子句。这很难看,但我认为这正是你要找的。你仍然需要在PHP代码中构建它,但我认为它应该给你你想要的东西。