2016-09-02 1 views
0

propertiesテーブルに4つの列があります。property_idvalueidmaterial_idです。私は、一致するプロパティに基づいてmaterial_idを見つけたいので、スキーマは少し複雑ですArray $properties列間の複数の関係に基づいてクエリを実行する方法 - MySQL?

は、私はまた、プロパティの配列を持っています。

例:

$properties = array(['property_id'=>1,'value'=>3],['property_id'=>2,'value'=>6],['property_id'=>3,'value'=>4]); 

例テーブル出力:

+----+-------------+-------------+-------+ 
| id | material_id | property_id | value | 
+----+-------------+-------------+-------+ 
| 1 |   1 |   3 |  5 | 
| 2 |   1 |   3 |  5 | 
| 3 |   1 |   3 |  5 | 
| 4 |   2 |   1 |  3 | 
| 5 |   2 |   2 |  6 | 
| 6 |   2 |   3 |  4 | 
| 10 |   4 |   1 |  9 | 
| 11 |   4 |   2 |  3 | 
| 12 |   4 |   3 |  6 | 
+----+-------------+-------------+-------+ 

は今、私はすべての特性を満足material_idを必要とします。どうやってやるの..?私はexist MySQLのステートメントを使用する必要がありますか?

+0

あなたは、もう少し明確だろうか?プロパティ配列に既にmaterial_idが含まれているようです... – Iain

+0

今、正しいです。ごめんなさい。 –

答えて

1

今、あなたの配列の各要素のために、あなたは、次のようになりますステートメントを実行したいと思うでしょう:あなたはまた、PHPコードに役立つ

SELECT material_id FROM properties WHERE property_id = 2 AND value = 3; 

必要がありますか?あなたはそれぞれのループごとにaを実行することができますが、詳細についてはデータベースとの通信にどのように使用しているのかを知る必要があります。

編集パフォーマンスを代表して

foreach ($properties as $foo => $bar) 
{ 
    $sql = 'SELECT material_id FROM properties WHERE '; 

    foreach ($bar as $key => $value) 
    { 
     $sql .= $key .' = '. $value .' AND '; 
    } 

    $sql .= 'true'; 

    *run your PDO code on $sql here* 
} 
+0

実際、私はPHPを使用しています。更新された例を見てください。 –

+0

これは、書かなければならない種類のクエリです。 mysqliまたはPDOを使用してmysqlに接続していますか? – Iain

+0

PDO、はい。私はPDOを使用しています。 –

1

それは良いアイデアのではないのですが、配列の値あたりのクエリを実行します。特大の配列を持っていれば、かなり遅くなることがあります。

<?php 

$properties = array(['property_id'=>1,'value'=>3],['property_id'=>2,'value'=>6],['property_id'=>3,'value'=>4]); 

$qCondition = []; 
foreach($properties as $prop) { 
    $q = sprintf("(property_id = %d AND value = %d)", $prop["property_id"], $prop["value"]); 
    $qCondition[] = $q; 
} 

// assuming that your database table name is 'materials' 
$sql = sprintf("SELECT * FROM materials WHERE (" . implode(" OR ", $qCondition) . ")"); 

echo $sql; 

結果:したがって

SELECT * FROM materials 
WHERE ((property_id = 1 AND value = 3) OR (property_id = 2 AND value = 6) OR (property_id = 3 AND value = 4)) 

、あなたが必要とする実行にただ1つのクエリ

ので、最善の解決策は、$propertiesアレイ上で提示されたすべての条件を含む単一のクエリを構築することができますすべての行を取得

あなたはここで提案された解決策で遊ぶことができます:http://ideone.com/kaE4sw

+0

実際には、指定されたプロパティを持つすべての行を選択し、すべてが同じ 'material_id'を持っているかどうかを確認し、trueなら' material_id'を取得する必要があります。それは 'または'では不可能です。私は結果セットにもPHPコーディングが必要だと思います。 –

+0

したがって、上記のクエリの結果が得られたら、結果を(phpを使用して)調べ、それらがすべて同じmaterial_idを持つかどうかを比較する必要があります。 –

+0

うん、私はSQLのみの方法を探していた。しかし、明らかにそれは存在しません。 –

関連する問題