Есть код:
$query = $mysqli->query("SELECT `contest_id`, `type_operation`, `name_val`, `name_prod`, `price`, SUM(`amount`) as amount , `total`, `dttm_create_order`, `dttm_close_order`, `status` FROM (SELECT `contest_id`, `type_operation`, `name_val`, `name_prod`, `price` , `amount` as amount , `total` , `dttm_create_order`, `dttm_close_order`, `status` FROM `bitorders` UNION SELECT `contest_id`, `type_operation`, `name_val`, `name_prod`, `price`, `amount` as amount , `total`, `dttm_create_order`, `dttm_close_order`, `status` FROM `orders` ) as tableobsh WHERE `name_prod`= 'aaa' AND status = 0 GROUP BY price , type_operation ORDER BY price " );
while ($row = $query->fetch_assoc()) {
//$orderbook['order_id'][] = $row['order_id'];
$orderbook['price'][] = $row['price']/100000000;
//$orderbook['user_id'][] = $row['user_id'];
$orderbook['contest_id'][] = $row['contest_id'];
$orderbook['type_operation'][] = $row['type_operation'];
$orderbook['name_val'][] = $row['name_val'];
$orderbook['name_prod'][] = $row['name_prod'];
$orderbook['amount'][] = $row['amount']/100000000;
$orderbook['total'][] = $row['total']/100000000;
$orderbook['dttm_create_order'][] = $row['dttm_create_order'];
$orderbook['dttm_close_order'][] = $row['dttm_close_order'];
$orderbook['status'][] = $row['status'];
}
$out = array(
'orderbook' => $orderbook
);
Будет ли идентичен данный код, если я запрос $query изменю, поменяв
WHERE `name_prod`= 'aaa'
на
$coins = array('aaa', 'bbb', 'ccc');
WHERE `name_prod` IN (" . implode(',', $coins) . ")
Т.е мне нужно весь код применить для массива name_prod
И да и нет.
Если вопрос об SQL и операторе IN
, то верно - заменяйте.
Если вопрос о php то имейте в виду, что implode объединит значения вашего массива в строку "aaa,bbb,ccc"
, что в итоге приведёт в запросу вида:
select
...
from ...
where name_prod in (aaa,bbb,ccc)
На такой запрос вы получите сообщение об ошибке: неизвестный столбец 'aaa' в 'where clause'
, - так как aaa,bbb,ccc
уже не будет строками с данном запросе.
Чтоб устранить ошибку вам необходимо будет либо изначально формировать массив с кавычками:
$coins = array("'aaa'", "'bbb'", "'ccc'");
Либо сделать это на этапе формирования запроса:
$coins = ["aaa", "bbb", "ccc"];
// some code
$name_prod = implode(", ",
array_map(
function($value) {
return "'$value'";
},
$coins
)
);
$query = ".. where name_prod in ($name_prod) and ...";
Кроме того, обратите внимание на то, что, итерируясь по результатам запроса, вы выполняете действия, которые можно было бы выполнить на этапе выполнения запроса к БД, например деление на 100000000 можно выполнять прямо в запросе:
select
contest_id,
type_operation,
name_val,
name_prod,
price / 100000000 as price,
SUM(amount) / 100000000 as amount,
total / 100000000 as total,
dttm_create_order,
dttm_close_order,
status
from some_table
Смело меняйте, это распространённая практика особенно когда в IN используется 1000 параметров. Это однозначно будет быстрее нежели запрос с 1000 “AND” или 1000 запросов. Но главное не переуспрдствовать. Если планируются частые выборки по строковому полю подумайте, возможно стоит использовать индекс для этого поля. Так же, если данные для этого массива получаете от пользователя, то лучше использовать PDO где все переменные будут вынесены в параметры, это поможет избежать SQL инъекции.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Для десериализации и сериализации использую библиотеку JacksonИногда на практике встречаюсь с требованием прописать сеттеры для класса сущности,...
There's a problem: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') (line 1, column 2)
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском