Mysql - 订购具有相同列内容的行

时间:2016-09-16 07:58:57

标签: mysql sql database

有一个 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

来做

注意:对不起,如果我的解释不太好。

2 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分:0)

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

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

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

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