【问题标题】:mysql update with subquery 2 level deep带有子查询2级深度的mysql更新
【发布时间】:2023-03-23 21:59:01
【问题描述】:

感谢您查看此问题。我有点迷茫,希望有人能帮助我。下面是我想运行的更新查询。
此查询现在返回错误:

1054 - “where 子句”中的未知列“spi.et_cross_rank”

一些背景:
来自表:tmp_ranking_tbl
我想获得第 nth(spi.et_return_rank) 记录
对于值为 x (spi.et_cross_rank)

的组
SET @rownum=0;      
    
UPDATE STRToer_Poule_indeling spi
SET spi.team_id = (SELECT R.team_poule_id 
  FROM (SELECT  @rownum:=@rownum+1 AS rownum, trt.team_poule_id 
       FROM tmp_ranking_tbl  trt
       WHERE trt.overal_rank = spi.et_cross_rank 
       ORDER BY trt.punten DESC, (trt.goals_voor - trt.goals_tegen) DESC, trt.goals_voor DESC) R
  WHERE R.rownum = spi.et_return_rank)
WHERE spi.et_ronde = v_et_ronde
AND spi.poule_id IN (SELECT row_id FROM STRToer_Poules WHERE toernooi_onderdeel_id=v_onderdeel_id) ;

tmp_ranking_tbl 中的数据如下所示:

team_poule_id | punten | goals_voor | goals_tegen | overal_rank
65            | 6      | 10         | 10          | 2 
69            | 6      | 9          | 10          | 2
75            | 7      | 11         | 4           | 2
84            | 6      | 6          | 8           | 2
112           | 5      | 7          | 7           | 2

提前感谢您的帮助!

在评论有关目标的问题后更新,我会尽量保持简短。 :-)
该查询在网站上用于保存锦标赛的分数。有时你有奇数支球队进入下一轮。那时我想选择最好的 3 号(spi.et_cross_rank)球队。这是保存在 STRToer_Poule_indeling 中的设置,每个 poule 的排名以及第 1、第 2 或第 n 队 (spi.et_return_rank)。表 tmp_ranking_tbl 中填满了所有排名为 3 的球队。当这个如果填满我想要第一个或第二个,取决于 STRToer_Poule_indeling 中的设置,记录返回。

STRToer_Poule_indeling 表的结构子集

row_id | team_id | et_ronde | et_cross_rank | et_return_rank
1      | null    | 1        | 3             | 1

【问题讨论】:

  • 也许是加入而不是子查询更新。
  • 谢谢,你知道一个例子吗?还没有找到通过加入来做到这一点的方法。 (可能是我正在看它很长)。
    (添加)我不知道如何使用连接的原因是 rownum 功能。记录集和限制的第 n 条记录不允许在其语句中使用变量

标签: mysql sql-update subquery


【解决方案1】:

只需检查您的桌子上是否有名为 et_cross_rank 的列STRToer_Poule_indeling

问题似乎是 SQL 在您的表中找不到该列。

希望对你有帮助。

【讨论】:

  • 是的,就在那里。我发现 dat 子查询只能使用其直接父级的值,而不能使用“树”中任何更高级别的值。这意味着此查询将不起作用。但是我还没有找到解决这个问题的方法。
  • 更新查询的目标是什么?把剩下的表给我看看,这样我可以更好地帮助你。但是,如果是范围问题,您可以尝试在内部 SELECT 中添加表“STRToer_Poule_indeling”,如下所示: FROM tmp_ranking_tbl trt, STRToer_Poule_indeling spi WHERE trt.overal_rank = spi.et_cross_rank
  • 在上面更新了更多细节。对于您的查询,tmp_ranking_tbl 和 STRToer_poule_indeling 之间没有关系,所以不知道如何加入
猜你喜欢
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2016-05-13
  • 2011-12-02
相关资源
最近更新 更多