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 请求,该请求将使用参数(客户端和地点)并将基本上检索所有行(基于标签的一次),具有以下优先级规则:
- 如果数据库中存在也有客户端的值,取那个
- 如果没有,就拿那个有客户端设置的,
- 终于拿下通用的
所以对于上面的例子应该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)
假设我们在数据库中有以下值:
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 请求,该请求将使用参数(客户端和地点)并将基本上检索所有行(基于标签的一次),具有以下优先级规则:
- 如果数据库中存在也有客户端的值,取那个
- 如果没有,就拿那个有客户端设置的,
- 终于拿下通用的
所以对于上面的例子应该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)