首页 > 解决方案 > MYSQL 可以 REGEXP 以相同的顺序返回

问题描述

我正在使用 REGEXP 通过从另一个查询中提供参数来从数据库中获取车辆名称。第一个查询是检查用户购买了哪些车辆,按数量对它们进行排序并将它们放入一个数组中。

我将 id 作为参数提供给 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

标签: phpmysqlsqlregexsql-order-by

解决方案


您可以使用以下ORDER BY FIELD()语法

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

这要求您按照您希望它们在结果集中的顺序枚举您期望在函数参数中出现的值。

我还建议不要使用正则表达式来过滤ids 列表:这效率不高,而且不可扩展。相反,您应该为运算符构造一个列表IN


推荐阅读