mysql查询生成?

Posted

技术标签:

【中文标题】mysql查询生成?【英文标题】:Mysql query generation? 【发布时间】:2011-01-05 14:59:00 【问题描述】:

我有几个不同的过滤器和搜索功能,我需要为其生成 mysql 查询。我想知道是否有可以使用的类或库。

例如,如果他们在那里输入带有日期的电子邮件,我需要在 sql 查询中间添加WHERE email='email' AND date`='date'。但如果他们也进入了一个城市,那么我需要添加它。

我在想把我需要搜索的所有东西放在一个数组中,然后用AND 将它内爆?谁有更好的建议?

【问题讨论】:

这可行。您可以使用 key=>value 来建立 field=>searchcriteria。不确定从长远来看你会从中获得多少好处......随着更复杂的需求的出现(比如做 LIKE 或比较),维护起来可能会很烦人。可能有人可以指向一个内置的库。 SQL Builder for php, with JOIN support?的可能重复 【参考方案1】:

我使用Zend_Db 来处理这类事情。快速示例,使用Zend_Db_Select:

$select = $db->select()->from("users");
if($email) 
    $select->where('email = ?', $email);

if($date) 
    $select->where('date = ?', $date);

// etc

// show query
// will output something like SELECT * from `users` WHERE email = 'email' AND date = 'date'
print_r($select->__toString()); 

// execute
$results = $db->fetchAll($select);
print_r($results);

【讨论】:

+1 表示 Zend_Db,Zend_Db_Select 可以在没有完整 Zend 框架的情况下使用,并且是一个出色的查询构建器。【参考方案2】:

我经常使用数组解决方案,因为它是查询条件最灵活的解决方案

$a[] = "email = 'email'";
$a[] = "firstname LIKE '%firstname%'";
$a[] = "date BETWEEN 'date_a' AND 'date_d'";
$a[] = "id > 123";

$query = ... " WHERE " implode(' AND ', $a); 

【讨论】:

【参考方案3】:

我会去添加所有给定的数据到这样的数组中:

$args = array(
  'email' => 'test@test.com',
  'date' => '2011-01-05',
  'city' => 'MyTown'
);

然后只通过它添加键和值到搜索中的foreach

$SQL = "WHERE "; 
foreach($args as $key => $val) 
  $SQL .= $key."='".$val."'"; 
  //And add the AND or OR where needed

【讨论】:

【参考方案4】:

常见的方法是创建一个包含不同查询部分的数组,然后根据您需要过滤的内容向它们添加元素。例如:

<?php

$sql_parts = array(
    'select' => array(),
    'from' => array(),
    'where' => array()
);

if ($filter_by_name != '')
    $sql_parts['select'][] = 'u.*';
    $sql_parts['from'][] = 'users AS u';
    $sql_parts['where'][] = "u.name = '".mysql_real_escape_string($filter_by_name)."'";


if ($filter_by_surname != '')
    $sql_parts['select'][] = 'u.*';
    $sql_parts['from'][] = 'users AS u';
    $sql_parts['where'][] = "u.surname = '".mysql_real_escape_string($filter_by_surname)."'";


//filter by data from another table
if ($filter_by_city_name != '')
    $sql_parts['select'][] = 'u.*, c.*';
    $sql_parts['from'][] = 'cities AS c';
    $sql_parts['from'][] = 'users AS u';
    $sql_parts['where'][] = "c.cityname = '".mysql_real_escape_string($filter_by_city_name)."'";
    $sql_parts['where'][] = "c.id = u.cityid";


$sql_parts['select'] = array_unique($sql_parts['select']);
$sql_parts['from'] = array_unique($sql_parts['from']);
$sql_parts['where'] = array_unique($sql_parts['where']);

$sql_query = "SELECT ".implode(", ", $sql_parts['select']).
                "FROM ".implode(", ", $sql_parts['from']).
                "WHERE ".implode(" AND ", $sql_parts['where']);
?>

【讨论】:

以上是关于mysql查询生成?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询过程

MYSQL 高级

mysql数据库怎么把查询出来的数据生成临时表

子查询作为mysql中的生成列?

如何在 MySQL 中使用自动表别名生成查询结果?

mysql查询性能优化