【问题标题】:How to create an MySQL conditional function that iterates through a table and takes multiple parameters如何创建一个遍历表并接受多个参数的 MySQL 条件函数
【发布时间】:2018-04-27 17:26:57
【问题描述】:

我对 PL/SQL 很陌生,但我想根据给定行中几个字段的值,为表中的所有条目填充一个空字段。 所以我想建立的逻辑是,但是在为汽车经销商设置表格时,我需要牢记几件事......

首先,按不同的 used_car_ids 分组,然后根据.....更新列

  1. 如果 used_car_id 列等于 new_car_id,并且 drive_mode 和 saftey_rating 均为 1,则将 Parking_Spot 编号设置为 1 作为最高优先级。
  2. 如果 used_car_id 列等于 new_car_id,但 drive_mode 为 1 且 saftey_rating 为 2,则将 Parking_Spot 列设置为 2 或可用的连续 Parking_Spot 编号

    • 如果有更多与此类似的条件,但只有安全评级不同,我想继续将 Parking_Spot 编号增加到该条目的下一个可用的连续 Parking_spot 编号
  3. 如果 used_car_id 列等于 new_car_id,但 drive_mode 为 2 且 saftey_rating 为 1,则将 Parking_Spot 列设置为 3,或下一个可用的 Parking_Spot 编号

  4. 如果 used_car_id 列等于 new_car_id,但 drive_mode 为 2 且 saftey_rating 为 2,则将 Parking_Spot 编号设置为 4,或下一个可用的 Parking_Spot 编号
    • 应用与上述相同的规则。

如果不满足最高优先级用例,则应将第 2 个用例视为最高优先级,并将其设为 Parking_Spot=1

这是我理想中想要的一张小照片。因此,正如您在图片中看到的,停车位编号为 1 和 2,具体取决于 used_car_id、new_car_id、drive_mode 和 safety_rating 是否为 1 和 2,但是一旦 used_car_id 和 new_car_id 不同,停车位编号将增加到 3 和 4 .

我假设我需要一个函数来输入 4 个参数,然后根据这些字段返回一个数字作为停车位。但我仍然有点不确定如何去做。任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • PL/SQL 是 Oracle 数据库的过程部分语言,但您已标记 mysql。您实际使用的是哪个?
  • 正确标记!!!!如果这是 Oracle,为什么我会在您的问题上看到 MySQL 标记???
  • 对不起,请多多包涵。我不知道 PL/SQL 仅适用于 Oracle。这是一个 MySQL 数据库。我刚刚编辑了问题的名称和标签。感谢大家指出这一点。

标签: mysql sql stored-procedures stored-functions mysql-5.7


【解决方案1】:

从您的标签中并不清楚您实际上是在使用 Oracle 数据库还是 MySQL。这个答案假设前者。

您的问题有几个空白,但您似乎想根据drive_modesafety_rating 为每一行指定一个序号。您多次提到“used_car_id column is equal to the new_car_id”,但当它们不相等时,从不提及您想做什么。

对于所写的问题,似乎可以使用分析函数以相当简单的方式解决。在这种情况下,我们将简单地告诉函数按drive_mode_idsafety_rating 对行进行排序,并为结果顺序中的每一行指定一个连续的数字:

SELECT id,
       used_car_id,
       new_car_id,
       car_features_id,
       drive_mode_id,
       safety_rating,
       ROW_NUMBER () OVER (ORDER BY drive_mode, safety_rating)
           AS parking_spot
FROM   your_table
WHERE  used_car_id = new_car_id

从 8.0.2 开始,MySQL 似乎支持分析函数(也称为窗口函数),因此如果您使用的是该版本或更高版本,上述解决方案应该仍然有效(如果没有,this answer 可能会有所帮助)。

要更新它以将used_car_id = new_car_id 也视为排序条件,您需要向 ORDER BY 添加一个条件:

SELECT id,
       used_car_id,
       new_car_id,
       car_features_id,
       drive_mode_id,
       safety_rating,
       ROW_NUMBER ()
       OVER (
           ORDER BY
               CASE WHEN used_car_id = new_car_id THEN 1 ELSE 2 END,
               drive_mode,
               safety_rating)
           AS parking_spot
FROM   your_table

这是未经测试的,所以我不能保证这在语法上是完全正确的,但它应该是接近的。

【讨论】:

  • 感谢您的回复艾伦,我正在使用 Mysql 数据库。很抱歉,这也是我想提出的另一点。如果 used_car_id 和 new_car_id 不相等,则应将其视为与相等的优先级相比较低的优先级。所以,如果有一行
  • 感谢您的回复艾伦,我正在使用 Mysql 数据库。对不起,我是想说那一点。但是如果 used_car_id 和 new_car_id 不相等,那么与相等的相比,它应该被视为较低的优先级。因此,如果有一行 used_car_id 和 new_car_id 尽管其他列的值相等,则它的 Parking_Spot 数应该比不相等的行低。我在想我需要通过 Parking_Spots 和 groupBy drive_mode 来订购。但是我喜欢这种方法,除了不能在 Workbench 上编译,你能帮帮我吗?
  • 这个查询是否有Mysql版本,因为Mysql中没有ROW_NUMBER或OVER等函数导致错误。
  • 我已经链接到另一个与在答案中模拟该功能有关的问题。
  • @user3116769 不正确标记不是没用吗???由于您在标题中添加了PL/SQL,因此人们认为您使用的是 Oracle。现在有人给你Oracle的解决方案,你不能使用它。你只是在浪费大家的时间!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多