簡體   English   中英

mysql 訂單字符串作為數字

[英]mysql order string as number

我已經搜索了幾天,以尋找一種在 mysql 中將字符串排序為數字的方法。

我的行看起來像這樣:

訂單列

1.1.2
1.1.100
1.1.1

在 mysql 中按此列升序將產生:

1.1.1
1.1.100
1.1.2

我有興趣獲得以下結果:

1.1.1
1.1.2
1.1.100

有沒有辦法使用 SQL 產生這個結果?

我的專欄的其他可能值:

28.1999.1.1
1
1.1.154.20
100.1.1.1.1.15

謝謝,我感謝大家的時間。

編輯: 存儲樹數據的快速關系方法(例如對文章的線程評論)看看第一個答案,Ayman Hourieh 的答案。 我正在努力使該解決方案發揮作用。 我的網站每篇文章的評論不超過 10k,所以我找到了這樣的解決方法:

000001
000002
000002.000001
000002.000001.000001
000002.000002
000002.000003
000003

基本上,將零放在我的評論計數器之前,這樣字符串比較就不會失敗。 但這僅適用於 99999 條評論。 我可以添加更多的零,比如說 10 個零,這將適用於 999999999 條評論,但我希望有一個更優雅的解決方案。

如果字符串不是太長,你可以做

ORDER BY cast(replace(your_column_name,'.','') as unsigned);

您將無法有效地執行此操作,因為這會丟失所有索引,但如果是一次性的,這將起作用。 可悲的是,由於 MySQL 無法(據我所知)一次替換多個字符,因此它看起來很糟糕。

SELECT value FROM TEST ORDER BY 
   REPLACE(
    REPLACE(
      REPLACE(
        REPLACE(
          REPLACE(
            REPLACE(
              REPLACE(
                REPLACE(
                  REPLACE(value, 
                    '1', '0'),
                  '2', '0'), 
                '3', '0'), 
              '4', '0'), 
            '5', '0'), 
          '6', '0'), 
        '7', '0'), 
      '8', '0'), 
    '9', '0'),value;

它基本上會用 0 替換所有數字,然后按順序排列。 由於. 0 之前的訂單,它將按數字組正確排序。 完成后,只需按值排序,因為具有相同數字組的任何值都應按正確順序排序。

為了提高效率,您可以將替換的值存儲為數據庫中的一列,以便您可以對其進行索引。

SQLfiddle 演示在這里

SELECT INET_ATON('10.0.5.9');

試試你的這個功能:)

也許這不是替代方案,因為它僅適用於 IP 地址類型。 而且您確實擁有比 IP 地址更多的部分。

這不會很有效並且可以清理,但這是如何做到這一點的一種想法。 它依賴於一個名為 integers 的表,其中一個名為 i 的列有 10 行,其值為 0 到 9。

SELECT somefield    , SUM(POW(100, occurrences - anInteger) * somefield_split) OrderField
FROM
    (SELECT id,anInteger,  somefield, SUBSTRING_INDEX(SUBSTRING_INDEX(somefield, ".", anInteger), ".", -1) AS somefield_split, LENGTH(somefield) - LENGTH(REPLACE(somefield, '.', '')) + 1 AS occurrences
    FROM splittertest, (SELECT a.i*10+b.i AS anInteger FROM integers a, integers b) Sub1
    HAVING occurrences >= anInteger) Sub2
GROUP BY somefield
ORDER BY somefield, OrderField

想法是子選擇獲取從 0 到 99 的數字范圍,並基於此將字符串與點分隔值分開。 它獲取特定字符串中的點數。 然后將字符串的每一位乘以 100 的部分總數減去該部分數量的冪,並在此基礎上求和。

所以 5.10.15 被分成 5、10 和 15。有 3 個部分,所以第一個部分乘以 100 的 (3 - 0) 次方,第二個部分乘以 100 的 (2 - 0) 次方,依此類推.

如果點數變化,這確實會產生奇怪的結果(即,點數越多的點總是越大),但這可以通過在計算功率時使用任何線上的最大點數而不是數字來解決該特定線上的點數。

祝你好運!

創建一個與此列相等的新列,並使用字符串替換 '.' 用 ''(什么都沒有)。 將此新字段存儲為數字。 在您的查詢中按此字段排序。

如果您無法向表中添加新列,您可以在 PHP 等中處理它。例如,出於在網站上的顯示目的,可以達到相同的效果。

http://php.net/manual/en/function.str-replace.php

你可以使用下面的sql

SELECT REPLACE(column_name,'.','') AS column_name1 FROM table_name ORDER BY column_name1;

如果您按最后一位數字組排序,則

SELECT CAST(MID(order_column, 
CHAR_LENGTH(order_column) - 
LOCATE('.',REVERSE(order_column))+2) AS DECIMAL) AS order_column_as_number
FROM thetable 
ORDER BY order_column_as_number

似乎工作。

如果有沒有 '.' 的字符串,則根本不起作用。 在它們中,如果您還想按其他組訂購,則必須提取更多部分來訂購,但如果您真的只想在 sql 中完成,這可能是一個開始。

確保這些數字的列是INT而不是 varchar。

如果您使用 varchar,您的列將按先有 1 的人排序,依此類推...

這是我對最多 4 位小數的數字的解決方案:

SELECT myCol, SUBSTRING_INDEX(myCol, ',', 1) * 10000 + LEFT(CONCAT(SUBSTRING_INDEX(myCol, ',', -1), '0000'), 4) as toOrder 
FROM `myTable`
ORDER BY toOrder DESC

您可以將其設置為 8 位小數,如下所示:

SELECT myCol, SUBSTRING_INDEX(myCol, ',', 1) * 100000000 + LEFT(CONCAT(SUBSTRING_INDEX(myCol, ',', -1), '00000000'), 8) as toOrder 
FROM `myTable`
ORDER BY toOrder DESC

等等...

先按 INSTR排序,然后通過替換“.”排序。

SELECT content_id FROM TEST ORDER BY INSTR(`content_id`, '.'), replace(`content_id`,'.','')

SQLfiddle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM