【问题标题】:Get a list of the last line of progress of each item sub-reference获取每个项目子引用的最后一行进度列表
【发布时间】:2021-11-29 12:49:40
【问题描述】:

我有两张桌子 a 和 b。表中有: 文章的唯一 ID,sref1:用于文章的子引用和文章的短名称。 在表 b 中,是她用历史来管理文章的完整性。 有一个唯一的标识符,completenessProgression 和 completenessObject_id 引用表 a 的标识符。

我的进度字段中表 b 的最后一行。 并且在同一个查询中,它将采用不重复 concat(“shortname”、“-”、“sub-reference”)的排序。 因此,作为对我的请求的回报,为每篇文章及其子参考保存最后一个进度。

目前我知道如何检索特定文章的进度的最后一个值:

SELECT oo_id, completenessProgression, completenessObject__id 
FROM object_20 WHERE object_20.completenessObject__id=171423 
ORDER BY object_20.oo_id DESC LIMIT 1;

我也知道如何使用 GROUP BY 按名称和子参考1检索文章:

SELECT object_20.oo_id AS Id, object_20.completenessObject__id AS id2,
object_20.completenessProgression AS Progress,
object_1.CSubRef1 AS Color, object_1.shortname AS Name
FROM object_20 INNER JOIN object_1
ON object_1.oo_id = object_20.completenessObject__id
WHERE object_20.completenessProgression >= 80
GROUP BY CONCAT(object_1.CSubRef1, ' ',object_1.shortname);

但是当我在 where 子句中添加 completenessProgression> 80 时。 对于每篇文章的名称和引用,它不采用我的完整性的最后一个值。

我已经测试了各种子请求,但我无法得到正确的结果。 我只能使用查询,没有脚本,没有触发器。

http://sqlfiddle.com/#!9/9a51d/1

+------------------------------------+
| Results Completeness > 80          |
+-----+----------+--------+----------+
| Id  | Name     | Color  | Progress |
+-----+----------+--------+----------+
| 2   | Armand   | Jaune  | 98       |
+-----+----------+--------+----------+
| 4   | Herbert  | Bleu   | 100      |
+-----+----------+--------+----------+

2021 年 11 月 30 日编辑

问题是,在我的情况下,我有一个子参考 2,它是大小,我不想要这个值,因为从一个子参考 2 到另一个的进展是相似的。

问题就在这里,我的行数与大小一样多,而我只希望每个 CSubRef1 一行而不是每个 CSubRef2 一行

如果我不清楚,我可以制作我当前输出的屏幕。这就是为什么在我的情况下我做了一个:

GROUP BY CONCAT(object_1.CSubRef1, ' ',object_1.shortname);

但它并没有按照我想要的方式工作

【问题讨论】:

标签: mysql sql


【解决方案1】:

由于进度的数字是唯一的,我怀疑,您可以使用子查询

但更好的解决方案是第二种,带有窗口功能,因为如果使用第二种并且有多个,则需要类似的解决方案

SELECT o20.*,o1.CSubRef1 ,  o1.shortname 
FROM object_20 o20 INNER JOIN object_1 o1 ON o1.oo_id = o20.completenessObject__id
INNER JOIN (SELECT MAX(completenessProgression) maxreg, shortname
FROM object_20 o20 INNER JOIN object_1 o1 ON o1.oo_id = o20.completenessObject__id
GROUP BY shortname) t1 On t1.shortname = o1.shortname  AND  t1.maxreg = o20.completenessProgression
WHERE o20.completenessProgression > 80
oo_id |完整性进展 |完整性对象__id | CSubRef1 |简称 ----: | ----------------------: | ---------------------: | :------- | :-------- 6 | 98 | 2 |黄昏 |阿尔芒 7 | 100 | 4 |蓝色 |赫伯特
SELECT 
    oo_id,CSubRef1,  shortname,completenessProgression
FROM (SELECT ROW_NUMBER() OVER (PARTITION BY shortname ORDER BY  completenessProgression DESC) rn
,o20.oo_id,CSubRef1,  shortname,completenessProgression
FROM object_20 o20 INNER JOIN object_1 o1 ON o1.oo_id = o20.completenessObject__id) t2
WHERE rn = 1
oo_id | CSubRef1 |简称 |完整性进展 ----: | :------- | :-------- | ----------------------: 6 |黄昏 |阿尔芒| 98 7 |蓝色 |赫伯特 | 100

db小提琴here

一切都在那里,你只需要将它们公开给公众

SELECT o20.completenessObject__id, o1.CSubRef1 ,  o1.shortname , o20.completenessProgression
FROM object_20 o20 INNER JOIN object_1 o1 ON o1.oo_id = o20.completenessObject__id
INNER JOIN (SELECT MAX(completenessProgression) maxreg, shortname
FROM object_20 o20 INNER JOIN object_1 o1 ON o1.oo_id = o20.completenessObject__id
GROUP BY shortname) t1 On t1.shortname = o1.shortname  AND  t1.maxreg = o20.completenessProgression
WHERE o20.completenessProgression > 80
完整性对象__id | CSubRef1 |简称 |完整性进展 ---------------------: | :------- | :-------- | ----------------------: 2 |黄昏 |阿尔芒| 98 4 |蓝色 |赫伯特 | 100
SELECT 
    completenessObject__id,CSubRef1,  shortname,completenessProgression
FROM (SELECT ROW_NUMBER() OVER (PARTITION BY shortname ORDER BY  completenessProgression DESC) rn
,o20.oo_id,CSubRef1,  shortname,completenessProgression,completenessObject__id
FROM object_20 o20 INNER JOIN object_1 o1 ON o1.oo_id = o20.completenessObject__id) t2
WHERE rn = 1
完整性对象__id | CSubRef1 |简称 |完整性进展 ---------------------: | :------- | :-------- | ----------------------: 2 |黄昏 |阿尔芒| 98 4 |蓝色 |赫伯特 | 100

db小提琴here

【讨论】:

  • 我忘了说我做了一个编辑。仅供参考,我使用左连接进行了测试,但它根本没有做我想要的。
  • 基本上是同一个查询,你可以根据需要选择每一列,即基本sql
猜你喜欢
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多