0

我敢肯定这个标题很混乱。不过,我想不出更好的表达方式。

这是我的困境;我有一张表,由数百行组成。当前列是 id(主键)、mfgr(制造商编号)、描述、价格。现在由于制造商 ID 的方式,87-10 位于 87-11 之前,但如果我通过 mfgr 订购,它将在这两者之间放置 87-100。所以我必须按其他东西订购(在这种情况下,主键自动递增 ID) 问题是,在初始设置时,ID 1 将分配给 87-10,而 id 2 将分配给 87-20。如果将来某个时候需要添加 87-11,则需要在 87-10 和 87-20 之间显示。无论如何,如果不将所有 id 移动一个,我就无法想到这样做。不过,在我这样做之前,我没有想到的另一种方法是什么?

4

5 回答 5

1

拆分制造商编号并存储在 2 个字段中,例如 mfgr1、mfgr2。(例如:将 87-11 拆分为 87 和 11)

然后,您可以根据需要对行进行排序:

select * from table1 order by mfgr1, mfgr2;

注意:如果您没有将 mfgr1 和 mfgr2 存储为整数,那么您可能希望在查询时将它们转换为整数。

解决方案 2:

这也必须有效:

select * from table1 order by convert(substring(mfgr,1,instr(mfgr,'-')-1), UNSIGNED INTEGER), convert(substring(mfgr,instr(mfgr,'-')+1), UNSIGNED INTEGER);
于 2012-12-15T04:37:15.983 回答
0

存储没有-作为一个数字的制造商编号,并-仅在您在屏幕上显示时显示(在第一个两位数字之后 - 插入回-)。

于 2012-12-15T04:38:45.783 回答
0

你应该能够使用类似的东西来做到这一点

SELECT * FROM table1 ORDER BY CAST(`mfgr` AS SIGNED) DESC
于 2012-12-15T04:40:41.180 回答
0

它可能会更慢,但您可以创建自己的函数:

  1. 使用 - 符号将字段拆分为两个数字(仍视为字符串)。
  2. 使用 MySQL LPAD() 函数确保两个数字在左侧填充相同数量的零。
  3. 重新组合两个填充的数字字符串并在函数中返回结果。
  4. 将该函数应用于查询的 WHERE 子句。

不过,我只会对一些临时报告使用这样的方法,否则如果查询将运行很多,则分为两列。

于 2012-12-15T04:49:49.947 回答
0

其他答案假设所有制造商编号都是##-#...(*两位数字 - 一位或多位数字)。情况可能并非如此,或者现在可能是真的,但不能保证。这是数据库设计的问题,而不是“什么算法可以使行保持有序。如果制造商 ID 始终是应该按数字排序的两个数字组件,则它们应该存储为 2 个数字列并格式化为一个以用于显示目的。真的考虑“按顺序插入行”是没有意义的。主键永远不需要更改。听起来您正在对 ID 使用自动增量。在这种情况下,ID 除了唯一标识一行。查询将需要一个 ORDER BY 子句来按顺序排列行。

于 2012-12-15T04:56:51.250 回答