Mysql-对具有相同列内容的行进行排序
有一个像那样的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完成它 注意:如果我的解释不太好,很抱歉。试试这个: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
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