0

我下面的示例“显然”不起作用 ::: 有没有办法获得IF ELSE或类似于工作的东西 ::: 我有几个 PHP 变量,基于这些变量我想更改 AND “子句”,而无需创建多个查询并使用 PHP if 语句来使用正确的查询块 :::

$query = "SELECT $wpdb->posts.ID
          FROM $wpdb->posts 
          INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
          WHERE 1=1 
          AND $wpdb->posts.post_type = 'cars' 
          AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'private') 

          IF ( $drive )
          AND ( ($wpdb->postmeta.meta_key = 'vehicle_year' AND CAST($wpdb->postmeta.meta_value AS CHAR) = '$year')
          ELSEIF ( $fuel  )
          AND ( ($wpdb->postmeta.meta_key = 'vehicle_fuel' AND CAST($wpdb->postmeta.meta_value AS CHAR) = '$fuel')
          ENDIF

          AND ( ($wpdb->postmeta.meta_key = 'vehicle_fuel' AND CAST($wpdb->postmeta.meta_value AS CHAR) = '$fuel') )
          GROUP BY $wpdb->posts.ID 
          ORDER BY $wpdb->posts.post_date 
          DESC LIMIT 0, 99";
4

5 回答 5

2
$p="";
$q="";
if( empty($drive) ){
    $p=" AND ( ($wpdb->postmeta.meta_key = 'vehicle_year' AND CAST($wpdb->postmeta.meta_value AS CHAR) = '$year')";
    }else{
        if( empty($fuel)  ){
            $q=" AND ( ($wpdb->postmeta.meta_key = 'vehicle_fuel' AND CAST($wpdb->postmeta.meta_value AS CHAR) = '$fuel')";
        }
    }

$query = "SELECT $wpdb->posts.ID
    FROM $wpdb->posts 
    INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
    WHERE 1=1 
    AND $wpdb->posts.post_type = 'cars' 
    AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'private') 
    ".$p.$q."
    AND ( ($wpdb->postmeta.meta_key = 'vehicle_fuel' AND CAST($wpdb->postmeta.meta_value AS CHAR) = '$fuel') )
    GROUP BY $wpdb->posts.ID 
    ORDER BY $wpdb->posts.post_date 
    DESC LIMIT 0, 99";
于 2013-01-27T08:47:37.900 回答
0

您可以使用if

或者你可以在 MYSQL中使用case whenwhich contains 。then, else end

于 2013-01-27T08:47:05.060 回答
0

根据您的 PHP 条件设置局部变量,然后使用它们(局部变量)准备 sql 查询...

于 2013-01-27T08:51:08.907 回答
0

试试这个:

$query = "SELECT $wpdb->posts.ID
      FROM $wpdb->posts 
      INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
      WHERE 1=1 
      AND $wpdb->posts.post_type = 'cars' 
      AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'private') 
      AND CASE WHEN $drive THEN $wpdb->postmeta.meta_key = 'vehicle_year' AND CAST($wpdb->postmeta.meta_value AS CHAR) = '$year'
               WHEN $fuel THEN $wpdb->postmeta.meta_key = 'vehicle_fuel' AND CAST($wpdb->postmeta.meta_value AS CHAR) = '$fuel'
               ELSE 1 = 1 END
      AND $wpdb->postmeta.meta_key = 'vehicle_fuel' AND CAST($wpdb->postmeta.meta_value AS CHAR) = '$fuel'
      GROUP BY $wpdb->posts.ID 
      ORDER BY $wpdb->posts.post_date 
      DESC LIMIT 0, 99";
于 2013-01-27T08:54:14.840 回答
0

这不是逻辑上等价的吗?

"...
(
    $drive AND ($wpdb->postmeta.meta_key = 'vehicle_year' AND CAST($wpdb->postmeta.meta_value AS CHAR) = '$year')
    OR
    $fuel AND ($wpdb->postmeta.meta_key = 'vehicle_fuel' AND CAST($wpdb->postmeta.meta_value AS CHAR) = '$fuel')
)
..."
于 2013-01-27T10:04:58.350 回答