【问题标题】:Mysql - Order rows that have same columns contentMysql - 排序具有相同列内容的行
【发布时间】:2016-09-16 23:14:19
【问题描述】:

有一个这样的 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)顺序后的操作以及新列(顺序)

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来做

注意:如果我的解释不太好,请见谅。

【问题讨论】:

  • 你的例子的第四行不应该是order=2?它具有相同的 ID 和相同的第一行语言
  • 为什么order=1id==4
  • 感谢您的注意,我用好表更新了我的问题。谢谢

标签: mysql sql database


【解决方案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;

在 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

【讨论】:

  • OP表示他使用的是Mysql而不是SqlServer
  • 答案完整
  • 谢谢 MtwStark,我正在努力理解这一切,我不是 Mysql 专家,所以需要一些时间:)
  • 我已将答案编辑为更易于阅读。取第一条SELECT 声明并用您的表名更改Table1,第一列应该是您需要的
  • 我正在使用 Mysql 但我真的不明白我该怎么做!我有一个问题: col1, col2, col3 我有 4 列应该相同来对行进行排名。你能帮我用我的表格列的名称翻译你的代码吗?如何在“顺序”列中设置排名? id-----idstudy--idarea-----idcategory----content--------lang----- order 和 idstudy--idarea-idcategory-lang 应该组的顺序是一样的 非常感谢
【解决方案2】:

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

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

特别感谢@MtwStark 的宝贵时间 :) 感谢您的帮助

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

【讨论】:

  • 感谢您的责任和支持 :)
猜你喜欢
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多