我有一种情况是查询取决于用户输入。如果用户输入玩具,那么查询将有一些OR,如果用户输入TV,则查询会略有不同。这样做的简单方法如下。但是,当我有很多不同的产品时,最好的方法是什么?我想创建一个数组来包含所有产品并在查询中使用if条件,但是如果这样做或者更好的方法?欣赏。
<?php
if ($toy){
$sql = $wpdb->get_results( $wpdb->prepare("
SELECT DISTINCT product FROM dis WHERE cat IN (%s, %s, %s)
AND (val !=%s AND mark='price')
or (val !=%s AND mark='country')
or (val !=%s AND mark='shipping')
or (val !=%s AND mark='quality')
or (val !=%s AND mark='frequency')
or (val !=%s AND mark='duration')
",$a,$b,$c,$d,$e,$f));
}
if($tv){
$sql = $wpdb->get_results( $wpdb->prepare("
SELECT DISTINCT product FROM dis WHERE cat IN (%s, %s, %s)
AND (val !=%s AND mark='price')
or (val !=%s AND mark='country')
or (val !=%s AND mark='shipping')
",$a,$b,$c,$d,$e,$f));
}
/*I have a lot*/
?>
&#13;
答案 0 :(得分:0)
您可以在PHP代码内或数据库表中存储映射(在产品类型及其参数之间)。在您将其存储在PHP中的情况下:
$mapping = Array(
'toy' => Array('country', 'shipping', 'quality', 'frequency', 'duration'),
'tv' => Array('country', 'shipping')
);
$query = 'SELECT DISTINCT product FROM dis WHERE cat IN (';
foreach($category as $k=>$v) $category[$k] = '"'.mysql_real_escape_string($v).'"';
$query .= implode(',', $category);
$query .= ') AND ((val !="'.mysql_real_escape_string($price).'" AND mark="price") ';
foreach($mapping[$kind] as $v)
$query .= ' or (val !="'.mysql_real_escape_string($parameter[$v]).'" AND mark="'.$v.'")';
$query .= ')';
$sql = $wpdb->get_results($query);
查看您的SQL我可以假设您有一个适用于所有产品的大表 - 每个产品都有很多行,每行产品都有一行。这是 BAD设计! 您最好使用2个单独的表 - 一个仅包含产品(每个产品只有一行),另一个表将包含产品参数(使用ONE-to-MANY关系) - 每个参数位于不同的行上。