我在这里有一个问题..我有一个动态表..我想问你一个问题,是否可以根据我的动态表创建一个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 = ?";
任何建议?
答案 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
但是通过首先将数据转换为列,然后搜索,可能更容易查询数据,类似于:
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
答案 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)));
请注意,您可能希望对获取列的顺序进行排序(如上所示),以便您知道应该向生成的语句提供参数的顺序;或者使用命名参数而不是匿名占位符。