【问题标题】:How to filter mysql query results based on a set of constraining parameters? [closed]如何根据一组约束参数过滤mysql查询结果? [关闭]
【发布时间】:2013-05-29 12:05:42
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

  • 使用 WHERE 子句?!
  • ^ 正确映射所有可能的约束。
  • 您几乎可以使用动态变化的WHERE 子句构建SQL 查询。查询的具体内容和查询方式取决于您的数据库结构。这个问题太模糊了,没有真正的答案。
  • @AlexandreLavoie 我意识到必须使用“where”子句。但是,我正在寻找基于用户选择的约束参数动态修改 sql 查询的 where 语句的方法。
  • 您为此编写代码。在最简单的形式中,您将字符串附加到查询字符串。我建议您开始编写一些代码并在遇到困难时提出问题;目前听起来你在没有真正开始的情况下想多了。

标签: php mysql database


【解决方案1】:

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

它将帮助您准确地实现您的意图并保持您的代码干净。

如果您使用的是 Yii 等框架,它已经提供了此功能,对于独立的查询构建器类,请尝试以下操作:

  1. http://www.phpclasses.org/package/2813-PHP-Dynamically-build-SQL-queries.html
  2. https://code.google.com/p/php-query-builder/

免责声明,我没有尝试或测试过任何这些。

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

<?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

【讨论】:

    【解决方案2】:

    将选择转换为 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";
    ?>
    

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

    你需要做两件事:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2013-09-29
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多