【问题标题】:MySQL: Update a "sort" column accoreding to ORDER BYMySQL:根据 ORDER BY 更新“排序”列
【发布时间】:2016-11-16 09:21:21
【问题描述】:

完全编辑: 我的查询有来自 2 个表的 2 列:文件名和排序顺序。

完整的表格在这里完成http://sqlfiddle.com/#!9/8c0507

例子:

SELECT * FROM table1 t1
  LEFT JOIN table2 t2
    ON t1.idmd5 = t2.imgid
ORDER BY t2.filename
WHERE t1.anotherid = "123456";

输出:

filename-01.jpg   - 12
filename-02.jpg   - 73
filename-03.jpg   - 1
filename-12.jpg   - 63
filename-24.jpg   - 99

现在,“排序顺序”列应该根据 ORDER BY 重新设置 - 输出,它应该从 1 开始。

预期结果:

filename-01.jpg   - 1
filename-02.jpg   - 2
filename-03.jpg   - 3
filename-12.jpg   - 4
filename-24.jpg   - 5

如何实现?

【问题讨论】:

  • 您想要UPDATE 操作吗?还是SELECT查询?
  • 我认为是更新。排序顺序中的内容应该更改/重新计算

标签: mysql select columnsorting


【解决方案1】:

这是查询:

  • ASCENDING ORDER中排序后为每个文件名分配一个行号。
  • 稍后在表别名 t 和您的 表YT 匹配文件名并将t.rn (row number/new sort order) 设置为YT.sortOrder 列。

UPDATE 
your_table YT 
INNER JOIN 
(
    SELECT 
        fileName,
        @rowNumber := @rowNumber + 1 AS rn
    FROM your_table , (SELECT @rowNumber := 0) var
    ORDER BY fileName ASC
) AS t
ON YT.fileName = t.fileName
SET YT.sortOrder = t.rn;

Demo Before update


访问 SQL FIDDLE 时遇到问题

测试模式(带数据):

DROP TABLE IF EXISTS `your_table`;
CREATE TABLE `your_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `filename` varchar(50) NOT NULL,
  `sortOrder` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);
INSERT INTO `your_table` VALUES ('1', 'f1', '12');
INSERT INTO `your_table` VALUES ('2', 'f2', '73');
INSERT INTO `your_table` VALUES ('3', 'f3', '1');
INSERT INTO `your_table` VALUES ('4', 'f4', '63');
INSERT INTO `your_table` VALUES ('5', 'f5', '99');

SELECT 
*
FROM your_table;

id  filename   sortOrder
1      f1         12
2      f2         73
3      f3          1
4      f4         63
5      f5         99

**Now Run the above query**



SELECT 
*
FROM your_table;

最终输出:

id  filename   sortOrder
1      f1         1
2      f2         2
3      f3         3
4      f4         4
5      f5         5

编辑:根据需求的变化

UPDATE 
tableone TOne 
INNER JOIN 
(
  SELECT
        t1.file_id,
        t2.IMG_FILENAME,
        @rowNumber := @rowNumber + 1 AS rn
    FROM
    tableone t1
    LEFT JOIN tabletwo t2 ON t1.FILE_ID = t2.IMG_ID
    CROSS JOIN (SELECT @rowNumber := 0) AS var
    ORDER BY t2.IMG_FILENAME ASC
) AS t
ON TOne.file_id = t.file_id
SET TOne.Order = t.rn;

测试数据和架构:

DROP TABLE IF EXISTS `tableone`;
CREATE TABLE `tableone` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order` int(11) NOT NULL,
  `file_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);
INSERT INTO `tableone` VALUES ('1', '12', '1');
INSERT INTO `tableone` VALUES ('2', '73', '2');
INSERT INTO `tableone` VALUES ('3', '1', '3');
INSERT INTO `tableone` VALUES ('4', '63', '4');
INSERT INTO `tableone` VALUES ('5', '99', '5');


DROP TABLE IF EXISTS `tabletwo`;
CREATE TABLE `tabletwo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `img_id` int(11) NOT NULL,
  `img_filename` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `tabletwo` VALUES ('1', '1', 'filename-01.jpg ');
INSERT INTO `tabletwo` VALUES ('2', '2', 'filename-02.jpg ');
INSERT INTO `tabletwo` VALUES ('3', '3', 'filename-03.jpg ');
INSERT INTO `tabletwo` VALUES ('4', '4', 'filename-04.jpg ');
INSERT INTO `tabletwo` VALUES ('5', '5', 'filename-05.jpg ');

运行上述(UPDATE)查询操作,查看结果

更新前SQL FIDDLE DEMO

更新后SQL FIDDLE DEMO

【讨论】:

  • 这个问题太抽象了,我的错。文件名和排序来自 2 个表,因此“真实”语句是: SELECT t1.ORDER, t2.IMG_FILENAME FROM tableone t1 LEFT JOIN tabletwo t2 ON t1.FILE_ID = t2.IMG_ID 如何处理?对不起……
  • 第一次没说出来真的很郁闷。现在请您根据您的新要求更新您的问题吗?
  • 那么,更新将在tableOne 中进行?最好分享这两张表的table structure code
  • 请查看 EDIT 部分下的更新答案。
  • 不起作用,因为其中没有 ORDER BY 子句。它在您的示例中有效,只是因为 SELECT 输出是正确“排序”的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2012-01-23
相关资源
最近更新 更多