有一个这样的Mysql表 id主键(idstudy、idarea、idcategory为外键)
**** Table : Operations
id idstudy idarea idcategory content lang
1 22 11 3 content1EN EN
2 22 11 3 content1FR FR
3 22 11 3 Content2FR FR
4 22 11 3 Content2EN EN
5 35 10 5 Content5EN EN
6 35 10 5 Content5FR FR
7 35 23 12 Content5EN EN
8 35 23 12 Content5FR FR
我的目标:将语言汇编到同一行(FR 和 EN)以获得一行加一列(例如 ContentEN)并删除 lang 列。
但我的问题是我的表没有按顺序排列,我无法通过 id 重新连接,我只知道 idstudy idarea 和 idcategory 但它们都不是唯一的,有时我有 3 行相同,除了(id 和内容)
我有解决方案,但我不知道如何在 mysql 中编写它:是用一种语言查找具有(相同的 idstudy 相同的 idarea 相同的 idcategory)的所有记录,然后通过添加列来排序它们(第一个结果为 1,第一个结果为 2第二个……)
**** 表:按组顺序(idstudy、idarea、idcategory)在每种语言中使用新列(order)进行操作
id idstudy idarea idcategory content lang order
1 22 11 3 content1EN EN 1
2 22 11 3 content1FR FR 1
3 22 11 3 Content2FR FR 2
4 22 11 3 Content2EN EN 1
5 35 10 5 Content5EN EN 1
6 35 10 5 Content5FR FR 1
7 35 23 12 Content5EN EN 1
8 35 23 12 Content5FR FR 1
我只需要这个结果,组装后我会用nodejs做
注意:如果我的解释不是很好,请见谅。
最佳答案
试试这个:
SELECT id, idstudy, idarea, idcategory, content, lang, dense_rank as 'order'
FROM (
SELECT
@dense:=IF(@prev_col1=t.idstudy AND @prev_col2=t.idarea AND @prev_col3=t.idcategory AND @prev_col4=t.lang, IF(@prev_col5=t.content, @dense, @dense+1), 1) AS dense_rank,
t.*,
@prev_col1:=t.idstudy, @prev_col2:=t.idarea, @prev_col3:=t.idcategory, @prev_col4:=t.lang, @prev_col5:=t.content
FROM (SELECT * FROM t1 ORDER BY idstudy, idarea, idcategory, lang, content ) t,
(SELECT @dense:=1, @prev_col1:=NULL, @prev_col2:=NULL, @prev_col3:=NULL, @prev_col4:=NULL, @prev_col5:=NULL) var
) F
ORDER BY idstudy, idarea, idcategory, lang, content;
在 MySql 中,您可以通过这种方式模拟 ms-sql 分析功能 Analytical Function in MySQL - ROW_NUMBER, RANK, DENSE_RANK
在 SQL-Sever 中你可以使用 DENSE_RANK()
SELECT *, DENSE_RANK() OVER (PARTITION BY idstudy, idarea, idcategory, lang ORDER BY content) [order]
FROM tableName
关于Mysql - 对具有相同列内容的行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39526454/