Wordpress - SQL-запрос по двум настраиваемым полям - PullRequest
0 голосов
/ 26 октября 2010

У меня до сих пор есть этот запрос:


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                   |

Если запрос может сделать таблицу похожей на приведенную выше, то мой простой ГДЕ это = это И это = это будет работать.

Любая помощь в этом вопросе очень ценится

Спасибо

Scott

РЕДАКТИРОВАТЬ: После некоторых поисков я теперь собрал этот код: http://pastebin.com/5YYDLyeR Он работает и возвращает структуру, которую я ищу, но как только я пытаюсь сделать WHERE для property_region и property_bedrooms, я получаю: # 1054 - Неизвестный столбец 'property_bedrooms' в 'where clause'

EDIT2: Хорошо, я взял код PMV и чтобы иметь возможность выполнить мое предложение WHERE, мне пришлось выполнить подзапрос: http://pastebin.com/dvTgsU7S Этот код делает то, что я хочу, но есть ли лучшие способы достижение этого запроса? Я предполагаю, что производительность будет проблемой, когда у меня более 1000 записей в БД ...

1 Ответ

1 голос
/ 26 октября 2010

Введите весь ваш запрос примерно так:

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, но я думаю, что он должен дать вам то, что вы хотите.

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