2016-09-02 4 views
0

У меня есть четыре столбца в таблице properties: property_id, value, id, material_id.Как выполнить запрос на основе множественных отношений между столбцами - MySQL?

У меня также есть множество свойств: Array $properties

Схема является немного сложнее, потому что я хочу, чтобы найти material_id на основе свойств соответствия.

Пример:

$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, который удовлетворяет все свойства. Как мне это сделать..? Нужно ли использовать инструкцию MySQL exist?

+0

Не могли бы вы быть немного более ясно? Кажется, что массив свойств уже содержит material_id ... – Iain

+0

Теперь это правильно. Сожалею. –

ответ

1

Теперь для каждого элемента в массиве вы хотите запустить заявление, которое выглядит следующим образом:

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

Вам нужна помощь в коде PHP также? Вы можете запустить для каждого цикла, но мне нужно будет знать, как вы используете для связи с вашей базой данных для получения более подробной информации.

редактировать

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

От имени производительности это не очень хорошая идея, чтобывыполнить запрос каждого значения массива. Если у вас есть негабаритный массив, все может стать довольно медленным.

Таким образом, наилучшим решением может стать создание одного запроса, включая все условия, представленные на $properties массива:

<?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)) 

Таким образом, вам нужно запустить только один единственный запрос до получить все нужные строки.

Вы можете играть с предложенным решением здесь: http://ideone.com/kaE4sw

+0

На самом деле, мне нужно выбрать все строки с заданными свойствами и проверить, имеют ли они все одинаковые 'material_id', и если true, то получите этот' material_id'. Это невозможно для 'или'. Наверное, нам нужно кодирование PHP и в наборе результатов. –

+0

Хорошо. Итак, как только вы получили результат из вышеуказанного запроса, вы должны пройти результаты (используя php) и сравнить, если все они имеют один и тот же файл material_id. –

+0

Yup, я искал только SQL-путь. Но, по-видимому, этого не существует. –

Смежные вопросы