0

ここに質問があります。1つの動的テーブルがあります。uaの質問をしたいのですが、動的テーブルに基づいてwhere句を作成することは可能ですか。説明させてください。

これは私のテーブルです

テーブル属性

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

そのtable.Name値に基づいて自動/動的where句を作成することは可能ですか?

width = ? AND Diameter = ? AND AR = ? AND etc

なにか提案を?

もっと説明させてください。

私の条件を含むvariabel$queryがあるとしましょう...

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

いや..私の$wherevariabelで、通常どおりに書くと、上のテーブルに基づいて..

$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

完全に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 に答える
1

多くの詳細を提供しなかったため、何を求めているのか明確ではありません。あなたが詳述した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 に答える