2013-05-29 7 views
1

Я получил MySQL таблицу как этотMySQL и массив PHP смесь

id | type | number 
1 | c | 2 
2 | c | 10 
3 | c | 20 

Также я получил PHP массив со значениями:

$array[c] = 5; 
$array[d] = 10; 

Я хочу сделать что-то вроде этого

(SELECT * FROM table WHERE number >= $array[ type ]) 

так что тип может быть взят из столбца mysql как-то и использован для нахождения правильной оценки e из массива.

Thats kinda tricky, но я не уверен, как лучше я мог бы спросить.

+0

Поскольку '$ массив [с] 'представляет собой целое число, что именно мешает вам использовать его в качестве параметра? –

+2

'где type = c и number> = 5' для' $ array [c] = 5; 'вы имеете в виду? –

+0

@YourCommonSense, это все, что я могу сделать из этого. –

ответ

2

Это не самый элегантный но что-то вроде этого?

$where = "WHERE "; 

foreach($array as $key => $value) 
{ 
    $where .= "(type = $key AND number >= $value) OR"; 
} 

$where = substr($where, 0, strlen($where)-2); 

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

Надеюсь, это позволит кому-то еще уловить и предоставить более элегантное решение.

+0

Я тестировал этот, и он работает. И это довольно просто. Так что этот ответ наилучшим образом отвечает на мой вопрос, я думаю;] хотя, я не испытал ответ kickstart, потому что его дольше. – fshock

+0

Оба будут выполнять эту работу.Это решение, скорее всего, даст SQL, который легче читать с первого взгляда. Мое решение избегает повторяющихся OR, и если количество проверок становится слишком большим, их можно легко изменить, чтобы использовать временную таблицу, а не выбирать значения для соединения. Если бы я использовал это решение, у меня возникло бы желание поместить каждую проверку в массив, а затем взорвать массив для создания WHERE (как это было в моем решении), но в основном, поскольку у меня есть немного отвращение к созданию строки а затем отрубать лишнюю ИЛИ. I substr используется, тогда нет необходимости использовать strlen, substr принимает отрицательный третий параметр – Kickstart

+0

Я согласен с @Kickstart, мой метод не очень практичен, так как он создаст массивную строку операторов SQL OR, склеенных друг с другом. Это то, чего я обычно избегал, но набирал вот так, чтобы помочь другим понять проблему. – MatthewMcGovern

0

Попробуйте это:

$type = 'c'; 
$query = "SELECT * FROM table WHERE number >= " . intval($array[ $type ]) . " AND type = '" . $type . "'"; 
+0

Что делать, если я беру несколько типов? Фактически я беру 6 типов из mysql. – fshock

1

пытаются сделать это в два этапа: перед использованием запроса SQL, чтобы поместить в массив значений типа

затем через некоторое время

(SELECT * FROM table WHERE number >= $array[$i]) 

где $ i - индекс цикла while

1

Возможно, немного лучше, чем использовать много ИНЕК бы что-то вроде этого: -

SELECT * 
FROM table a 
INNER JOIN 
    (SELECT 'c' AS RowType, 5 AS RowVal 
    UNION 
    SELECT 'd', 10) Sub1 
ON a.type = Sub1.type AND a.number >= Sub1.RowVal 

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

В PHP сделать что-то вроде этого: -

<?php 
$SubQuery = array(); 
foreach ($array AS $key=>$value) 
{ 
    $SubQuery[] = "SELECT '$key' AS RowType, $value AS RowVal"; 
} 

$sql = "SELECT * 
FROM table a 
INNER JOIN (".implode(" UNION ", $SubQuery).") Sub1 
ON a.type = Sub1.type AND a.number >= Sub1.RowVal"; 

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