0

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

这是我的桌子

表属性

_____________________
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;

不..在我的 $where 变量中,如果我正常编写,根据我上面的表格,它将是..

$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 = ?";

有什么建议吗?

4

2 回答 2

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

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

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

于 2012-11-05T16:45:16.283 回答
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)));

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

于 2012-11-05T16:45:26.377 回答