Mysql-对具有相同列内容的行进行排序

Mysql-对具有相同列内容的行进行排序,mysql,sql,database,Mysql,Sql,Database,有一个像那样的Mysql表 id主键(idstudy、IDrea和idcategory是外键) 我的目标是:将语言汇编到同一行(FR和EN),以获得一行加一列(例如ContentEN),并删除lang列 但我的问题是我的表没有按顺序排列,我无法按id重新连接,我只知道idstudy IDrea和idcategory,但它们都不是唯一的,有时我有3行,除了(id和内容)之外都是相同的 我有一个解决方案,但我不知道如何在mysql中编写:就是用一种语言查找所有记录(相同的idstudy相同的idre

有一个像那样的Mysql表 id主键(idstudy、IDrea和idcategory是外键)

我的目标是:将语言汇编到同一行(FR和EN),以获得一行加一列(例如ContentEN),并删除lang列

但我的问题是我的表没有按顺序排列,我无法按id重新连接,我只知道idstudy IDrea和idcategory,但它们都不是唯一的,有时我有3行,除了(id和内容)之外都是相同的

我有一个解决方案,但我不知道如何在mysql中编写:就是用一种语言查找所有记录(相同的idstudy相同的idrea相同的idcategory),然后通过添加列对它们进行排序(第一个结果为1,第二个结果为2…)

****表:每种语言的组顺序(idstudy、IDREA、idcategory)后的操作和新列(顺序)

我只需要这个结果,在组装之后,我将使用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分析功能

在SQL Server中,您可以使用稠密的_RANK()


最后我找到了另一个解决方案,我制作了两个结构相同的表(法语和英语),重新生成每个表的id(每个表的id为1.2.3)

由于每个表中有500行,我检查了每行是否正常(每个id必须涉及两种语言中的相同内容)

特别感谢@MtwStark抽出时间:)我感谢您的帮助


有时,当我们试图解释我们的问题时,我们会找到解决方案:)

示例的第四行不应该是
order=2
?它具有相同的id和第1行的相同语言为什么
order=1
位于
id==4
?感谢您的注意,我用良好的表格更新了我的问题。thanksOP表示他使用的是Mysql,而不是SQLServer答案是Complete谢谢你MtwStark,我正在努力理解所有这些,我不是Mysql专家,所以这需要一段时间:)我编辑了答案以便更简单地阅读。拿第一个
SELECT
statemente并用您的表名更改
Table1
,第一列应该是您需要的,我正在使用Mysql,但我真的不明白我怎么能点它!我有一个问题:col1,col2,col3我有4个列,它们应该是相同的来排列行。你能帮我翻译你的代码和我的表列的名称吗?如何设置列“顺序”中的排名?id---idstudy---IDrea---idcategory---content---lang---order和idstudy---IDrea-idcategory lang应该是相同的,以制作组的订单非常感谢感谢您的争议和支持:)
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
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;
SELECT *, DENSE_RANK() OVER (PARTITION BY idstudy, idarea, idcategory, lang ORDER BY content) [order]
FROM tableName