动态where子句mysql php

时间:2012-11-05 16:14:59

标签: php mysql dynamic-sql

我在这里有一个问题..我有一个动态表..我想问你一个问题,是否可以根据我的动态表创建一个where子句..让我解释一下..

这是我的表

tabel属性

_____________________
idAttribute | Name
_____________________
1           | Width
2           | Diameter
3           | AR
etc

是否可以仅基于该table.Name值

创建自动/动态where子句
width = ? AND Diameter = ? AND AR = ? AND etc

有什么建议吗?

让我更多解释..

假设我有一个包含我的条件的变量$ query ...

$query = "SELECT * FROM xxx WHERE ".$where;

Nah ..在我的$ where variabel中,如果我正常写的话,基于我上面的表格,它将是..

$where = "width = ? AND diameter = ? AND AR = ?";

我的问题是如何基于上面的表创建$ where动态,所以如果上面的表是

idAttribute | Name
__________________
1           | Width
2           | Diameter
3           | AR
4           | Weight

它将自动像这样

$where = "width = ? AND diameter = ? AND AR = ? AND weight = ?";

任何建议?

2 个答案:

答案 0 :(得分:1)

由于您没有提供很多细节,因此您所询问的内容并不十分清楚。我根据您详述的一个表做了一些假设。如果您要查询基于name值的数据,可以使用以下内容:

select i.name i_name,
  a.name a_name,
  ia.value
from item i
left join item_attribute ia
  on i.itemid = ia.itemid
left join attribute a
  on ia.idattribute = a.idattribute
where a.name = 'Width'
  and ia.value = 100

请参阅SQL Fiddle with Demo

但是通过首先将数据转换为列,然后搜索,可能更容易查询数据,类似于:

select *
from
(
  select i.name i_name,
    sum(case when a.name = 'Width' then ia.value end) width,
    sum(case when a.name = 'Diameter' then ia.value end) diameter,
    sum(case when a.name = 'AR' then ia.value end) ar,
    sum(case when a.name = 'Weight' then ia.value end) weight
  from item i
  left join item_attribute ia
    on i.itemid = ia.itemid
  left join attribute a
    on ia.idattribute = a.idattribute
  group by i.name
) src
where width = 100

请参阅SQL Fiddle with Demo

答案 1 :(得分:1)

完全在SQL中执行聚合:

$qry = $dbh->execute('
  SELECT GROUP_CONCAT(
    "`", REPLACE(Name, "`", "``"), "` = ?"
    ORDER BY ...
    SEPARATOR " AND "
  ) FROM Attribute
');
$where = $qry->fetchColumn();

或部分SQL,部分PHP:

$qry = $dbh->execute('
  SELECT   CONCAT("`", REPLACE(Name, "`", "``",), "` = ?")
  FROM     Attribute
  ORDER BY ...
');
$where = implode(' AND ', $qry->fetchAll(PDO::FETCH_COLUMN, 0));

或者完全用PHP:

mb_regex_encoding($charset); // charset of database connection

function foo($n) {return '`'.mb_ereg_replace('`','``',$n).'` = ?';}
$qry = $dbh->execute('SELECT Name FROM Attribute ORDER BY ...');
$where = implode(' AND ', array_map('foo', $qry->fetchAll(PDO::FETCH_COLUMN, 0)));

请注意,您可能希望对获取列的顺序进行排序(如上所示),以便您知道应该向生成的语句提供参数的顺序;或者使用命名参数而不是匿名占位符。