有一个 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
来做注意:对不起,如果我的解释不太好。
答案 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的时间:)感谢您的帮助
有时当我们尝试解释我们的问题时,我们会找到解决方案:)