Gorm 检索所有由其他字段优先的字段数据的唯一性

Gorm retrieve all unique by field data prioritized by other fields

假设我们在数据库中有以下值:

 id label  value   client  place
  1  test  value1  a       home
  2  test  value2  a
  3  test  value3
  4  test1 value4  b
  5  test1 value5
  6  test2 value6

我正在尝试发出 GET 请求,该请求将使用参数(客户端和地点)并将基本上检索所有行(基于标签的一次),具有以下优先级规则:

  1. 如果数据库中存在也有客户端的值,取那个
  2. 如果没有,就拿那个有客户端设置的,
  3. 终于拿下通用的

所以对于上面的例子应该return:

  id label  value  client  place
  1  test  value1  a       home
  4  test1 value4  b
  6  test2 value6

我想知道我是否可以通过使用 gorm 语法来实现这一点,我正在尝试与之集成:

  SELECT * FROM `mytable`ORDER BY label, client DESC, place DESC

这很棘手。我肯定没有完全正确的答案,因为我使用的是 Oracle。

Oracle 支持 JOIN 的不同语法(WHERE o."label" = i."label"),因此我希望我的解决方案无法使用 MySQL。

这是我能想到的最好的,它在 Oracle 中对我有用。希望它能帮助您指明正确的方向:

SELECT m.* 
FROM MY_TABLE m
WHERE m."id" IN (
    SELECT o."id"
    FROM (SELECT DISTINCT i."id", i."label", i."client", i."place"
        FROM MY_TABLE i
        ORDER BY i."label", i."client" DESC NULLS LAST, i."place" DESC NULLS LAST) o
    WHERE m."label" = o."label" AND ROWNUM = 1
);

该方法背后的逻辑是

  • 订购 table (i)
  • select 每个不同标签的第一个“id”(o)
  • select 这些 id 的所有数据 (m)