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

标签 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)在每种语言中使用新列(order)进行操作

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做

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

最佳答案

试试这个:

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

关于Mysql - 对具有相同列内容的行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39526454/

相关文章:

mysql - 如何在 Doctrine 中转义单引号

php - SQLSTATE[HY000] : General error

sql - 选择保存sqlite数据库的位置

mysql - 在sql中,当我在将其中一列作为主键后使用 'group by'时,它没有在所需的组中显示输出?

php - 在同一查询中选择和更新

mysql - 无法在express.js中获取请求的API

php - 请帮助我使用 php trim 函数

php - 将带有 MySQL 数据库的 PHP 程序转换为 .exe 文件

MySQL View ,包含来自 PostgreSQL 数据库的数据

MySQL Auto-Inc 错误?