Запрос с Foreach внутри - PullRequest
       3

Запрос с Foreach внутри

0 голосов
/ 21 октября 2011

Я бы хотел, чтобы в запросе Wordpress был foreach.

$aid=0;
    foreach ($QA as $key => $value) {
    AND wp_postmeta.post_id IN (
        SELECT wp_postmeta.post_id
        FROM wp_postmeta, wp_posts
        WHERE wp_posts.ID = wp_postmeta.post_id
        AND wp_posts.post_status = 'publish'
        AND wp_posts.post_type = 'post'
        AND wp_postmeta.meta_key = '$key'
        AND wp_postmeta.meta_value = '$value'
    )
    $aid++;
}

Но он не работает таким образом, поэтому я прошу помощи -

Как яможно поставить foreach в запросе sql?

Полный пример кода ниже.

<?php
 function query_products($QA) {

global $wpdb;
global $post;
global $pageposts;

$querystr = "

SELECT wp_posts.*, wp_postmeta.*
FROM wp_postmeta, wp_posts
WHERE wp_posts.ID = wp_postmeta.post_id
AND wp_posts.post_status = 'publish'
AND wp_posts.post_type = 'post'
AND wp_postmeta.meta_key = 'country'
AND wp_postmeta.meta_value = 'Denmark'

$aid=0;
    foreach ($QA as $key => $value) {
    AND wp_postmeta.post_id IN (
        SELECT wp_postmeta.post_id
        FROM wp_postmeta, wp_posts
        WHERE wp_posts.ID = wp_postmeta.post_id
        AND wp_posts.post_status = 'publish'
        AND wp_posts.post_type = 'post'
        AND wp_postmeta.meta_key = '$key'
        AND wp_postmeta.meta_value = '$value'
    )
    $aid++;
}

ORDER BY wp_postmeta.meta_value ASC 
    ";

$pageposts = $wpdb->get_results($querystr, OBJECT);

}

$QA = array (
    'key1' => 'value1',
    'key2' => 'value2',
    'key3' => 'value3',
);
query_products($QA);
?>

Ответы [ 3 ]

0 голосов
/ 21 октября 2011

Не зная, что должен выполнить запрос, я могу только предложить что-то вроде этого:

<?php

$querystr = "
SELECT wp_posts.*, wp_postmeta.*
FROM wp_postmeta, wp_posts
WHERE wp_posts.ID = wp_postmeta.post_id
AND wp_posts.post_status = 'publish'
AND wp_posts.post_type = 'post'
AND wp_postmeta.meta_key = 'country'
AND wp_postmeta.meta_value = 'Denmark'
AND wp_postmeta.post_id IN (
    SELECT wp_postmeta.post_id
    FROM wp_postmeta, wp_posts
    WHERE wp_posts.ID = wp_postmeta.post_id
    AND wp_posts.post_status = 'publish'
    AND wp_posts.post_type = 'post'
";
if (count($QA) >= 1) {
    $querystr .= " AND ( ";
    foreach($QA as $key => $value) {
        $querystr .= "(wp_postmeta.meta_key = '{$key}' AND wp_postmeta.meta_value = '{$value}') OR ";
    }
    // get rid of the last "OR" in the string
    $querystr = substr($querystr,0,strrpos($querystr,"OR"));
    $querystr .= " ) ";
}
$querystr .= " ORDER BY wp_postmeta.meta_value ASC ";

?>

Обратите внимание, что я использовал "ИЛИ" выше, потому что вы никогда не получите никаких результатов при проверке одного поля для нескольких значений с помощью предложения "И".

0 голосов
/ 21 октября 2011

Вам нужно передать все ключи в виде массива или выполнить полный запрос итеративно (включая select).Я бы не рекомендовал последнее, потому что производительность будет плохой (чрезмерные обращения к базе данных плохие).Итак, я бы сделал что-то подобное, пока $ QA не слишком велико.Я полагаю, что это немного проще, чем полный подзапрос, первоначально представленный с использованием предложения EXISTS, но это может быть скорее делом вкуса, чем один действительно лучше, чем другой.

0 голосов
/ 21 октября 2011
$querystr = "
SELECT wp_posts.*, wp_postmeta.*
FROM wp_postmeta, wp_posts
WHERE wp_posts.ID = wp_postmeta.post_id
AND wp_posts.post_status = 'publish'
AND wp_posts.post_type = 'post'
AND wp_postmeta.meta_key = 'country'
AND wp_postmeta.meta_value = 'Denmark'
";

$aid=0;
    foreach ($QA as $key => $value) {
       $querystr .= "
    AND wp_postmeta.post_id IN (
        SELECT wp_postmeta.post_id
        FROM wp_postmeta, wp_posts
        WHERE wp_posts.ID = wp_postmeta.post_id
        AND wp_posts.post_status = 'publish'
        AND wp_posts.post_type = 'post'
        AND wp_postmeta.meta_key = '$key'
        AND wp_postmeta.meta_value = '$value'";
    )
    $aid++;
}
$querystr .=" ORDER BY wp_postmeta.meta_value ASC";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...