我想帮你解决这个问题根据几个规则选择行
这样做的目的是为每个用户选择与语言匹配的行id @lenguage,否则选择创建的第一语言。
因为没有row_number(),所以不得不使用用户变量。假设我添加了一个字段test_id,这样就可以将所有的情况放在同一个表中。
SQL演示
SELECT t.* , (`language` = @language) as tt,
@rn := if (@partition = CONCAT(`test_id`, '-', `user`),
@rn + 1,
if(@partition := CONCAT(`test_id`, '-', `user`), 1, 1)
) as rn,
@partition
FROM Table1 t
CROSS JOIN ( SELECT @language := 'de', @rn := 0, @partition := '' ) as var
ORDER BY CONCAT(`test_id`, '-', `user`),
(`language` = @language) DESC,
`created`输出
但是即使ORDER BY给出了正确的排序,分区1-4和3-4也不要把语言'de'放在第一位。因此,有些东西正在改变变量@rn的分配方式。
| test_id | id | title | language | created | user | tt | rn | @partition |
|---------|----|-------|----------|----------------------|------|----|----|------------|
| 1 | 3 | c | de | 2019-01-03T00:00:00Z | 4 | 1 | 3*| 1-4 |
| 1 | 1 | a | en | 2019-01-01T00:00:00Z | 4 | 0 | 1 | 1-4 |
| 1 | 2 | b | es | 2019-01-02T00:00:00Z | 4 | 0 | 2 | 1-4 |
| 2 | 1 | a | en | 2019-01-01T00:00:00Z | 4 | 0 | 1 | 2-4 |
| 2 | 2 | b | es | 2019-01-02T00:00:00Z | 4 | 0 | 2 | 2-4 |
| 3 | 1 | a | en | 2019-01-01T00:00:00Z | 3 | 0 | 1 | 3-3 |
| 3 | 3 | b | de | 2019-01-03T00:00:00Z | 4 | 1 | 2*| 3-4 |
| 3 | 2 | b | es | 2019-01-02T00:00:00Z | 4 | 0 | 1 | 3-4 |
| 3 | 4 | c | de | 2019-01-04T00:00:00Z | 5 | 1 | 1 | 3-5 |发布于 2019-08-01 22:10:37
排序是在选择所有行之后完成的。您的@rn变量是在行选择期间设置的,因此它使用的是行的内部顺序,而不是ORDER BY子句中指定的顺序。
您需要将排序移到子查询中,然后在主查询中计算@rn。
SELECT t.*,
@rn := if (@partition = CONCAT(`test_id`, '-', `user`),
@rn + 1,
if(@partition := CONCAT(`test_id`, '-', `user`), 1, 1)
) as rn,
@partition
FROM (
SELECT *, (language = @language) AS tt
FROM Table
CROSS JOIN (SELECT @language := 'de') AS var
ORDER BY CONCAT(test_id, '-', user),
tt DESC,
created
) AS t
CROSS JOIN ( SELECT @rn := 0, @partition := '' ) as varhttps://stackoverflow.com/questions/57317471
复制相似问题