MYSQL REGEXP может вернуть в том же порядке - PullRequest
0 голосов
/ 10 марта 2020

Я использую REGEXP для получения названий автомобилей из базы данных, передавая им параметры из другого запроса. Первый запрос проверяет, какие транспортные средства купил пользователь, сортирует их по количеству и помещает их в массив.

Я даю идентификаторы в качестве параметров для REGEXP, например: '3 | 5 | 1 | 2 'и возвращает их отсортированные в числовом порядке (название автомобиля для 1,2,3,5 вместо названия автомобиля для 3,5,1,2). Я хочу, чтобы они возвращались так же, как я их ввел, или, если есть способ сделать это в PHP, а не SQL, пожалуйста, поделитесь им!

EXAMPLE:
$vehicles_user_has = array (         //from the first query
//ID => AMOUNT
"2" => "5"    //id2 = firetruck
"1" => "3"   //id1 = police car
"4" => "1"  //id4 = ambulance
);

$onlyid = implode("|", (array_keys($user_vehicles_array))); ----> gives me "2|1|4"

$findnames = $conn->prepare("SELECT vehicle_name,vehicle_id FROM vehicles WHERE vehicle_id REGEXP '$onlyid'");
$findnames->execute();

while ($row = $findnames->fetch(PDO::FETCH_ASSOC)) {
    echo $row['vehicle_name'] . " x " . $user_vehicles_array[$row['vehicle_id']] . "<br>";
}

This returns them sorted by ID (1,2,4):
Police car x 3
Firetruck x 5
Ambulance x 1

I want it to return:
Ambulance x 1
Police car x 3
Firetruck x 5

1 Ответ

3 голосов
/ 10 марта 2020

Вы можете использовать синтаксис ORDER BY FIELD() :

ORDER BY FIELD(vehicle_id, 2, 1, 4)

Для этого необходимо перечислить значения, которые вы ожидаете в аргументах функции, в том порядке, в котором вы хотите их получить в набор результатов.

Я бы также рекомендовал не использовать регулярное выражение для фильтрации списка id s: это неэффективно и не масштабируется. Вместо этого вы должны создать список для оператора IN.

...