如何根据一组约束参数过滤mysql查询结果?

时间:2013-06-03 10:52:09

标签: php mysql database

考虑任何电子商务网站的情况,我们根据零到'n'个数量的约束参数(如价格,可用性,品牌等)过滤产品结果,其中'n'是允许约束的最大可能数量。在这样做的同时,我们也可以添加或删除参数选择(例如,删除价格约束)。

我正在尝试使用mysql和Php为上述场景制作一个小型原型。

我知道我们将使用嵌套查询并继续过滤产品ID的选择(在这种情况下为主键)。可以根据生成的产品ID集显示最终结果。

我仍然想知道开始这个的最佳方法是什么。任何帮助将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

您的回答给人的印象是您可能需要在项目中使用查询构建器类。

它将帮助您完全达到预期目的并保持代码清洁。

如果你正在使用Yii这样的框架,它已经为独立的查询构建器类提供了这个功能,请试试这些:

  1. http://www.phpclasses.org/package/2813-PHP-Dynamically-build-SQL-queries.html
  2. https://code.google.com/p/php-query-builder/
  3. 免责声明,我没有尝试或测试任何这些。

    以下是列表中第二个选项的代码示例:

    <?php
    require_once './QueryBuilder.php';
    
    $qb = QueryBuilder::create()
        ->select(array('column1', 'alias' => 'column2'))
        ->from('mytable as mt')
        ->join('another_table at', 'on', 'at.id = mt.fk_at_id')
        ->where('mt.status = 1')
        ->group('mt.group_field')
        ->order('mt.date_field desc')
        ->limit(15); 
    // when printed, gives the following query:
    // SELECT column1,column2 as alias
    //  FROM mytable as mt
    //  JOIN another_table as at on at.id = mt.fk_at_id
    //  WHERE mt.status = 1
    //  GROUP BY mt.group_field
    //  ORDER BY mt.date_field as desc
    //  LIMIT 15
    

答案 1 :(得分:0)

将选择转换为SQL

基本上,您需要一种方法将复选框选择转换为where语句。 这里描述了这个概念的一个非常基本的例子:https://stackoverflow.com/a/14761616/1688441

引用(最简单的示例):

<?php
$location= $_GET['location'];
$language= $_GET['language'];
$name= $_GET['name'];

if($location!=""){
    $where[] = " `location` = '".mysql_real_escape_string($location)."'";
}
if($language!=""){
    $where[] = " `language` = '".mysql_real_escape_string($language)."'";
}
if($name!=""){
    $where[] = " `name` = '".mysql_real_escape_string($name)."'";
}
$where_clause = implode(' OR ', $where);
//same code for the other 2 options

$sql_json = "SELECT * FROM myTable WHERE $where_clause ORDER BY id DESC";
?>

如果您想制作更具动态性的解决方案

你需要做两件事:

  • 创建一个关联数组,其中key是字段,值是要分配给where语句的值。您还可以根据需要使用其他数据结构。
  • 编写一个函数,该函数接受关联数组并创建where语句以附加到SQL语句。