Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > PHP > PHP Forum > mysql sort order แบบภาษามนุษย์ มีวิธี"จริงๆ"ไหมครับ?



 

mysql sort order แบบภาษามนุษย์ มีวิธี"จริงๆ"ไหมครับ?

 



Topic : 077635



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์




ตัวอย่างข้อมูลในฐานข้อมูล
name
c1
c2
c3
c04
c5
c19

ถ้าใช้คำสั่ง
select * from table order by name asc
ก็จะได้
c04
c1
c19
c2
c3
c5
ซึ่งไม่ใช่การเรียงแบบที่มนุษย์จะเข้าใจเพราะมันไม่ถูกต้อง


ก็เลยมีคนแก้ปัญหาโดยใช้คำสั่ง
select * from table order by length(name), name asc
ก็จะได้
c1
c2
c3
c5
c04
c19
ซึ่ง c04 มันมาทีหลัง c5??? ได้ด้วยหรือ? ผมว่าการเรียงตามแบบมนุษย์มันก็ยังไม่น่าจะใช่


จริงๆแล้วควรจะเป็น
c04
c1
c2
c3
c5
c19
หรือ
c1
c2
c3
c04
c5
c19
แบบไหนก็ยังพอเข้าใจและยอมรับได้

มันมีวิธีสั่งให้จัดเรียงตามแบบของมนุษย์ไหมครับ?
เคยเข้าไปอ่าน feature request ของ mysql มีคนเขาขอมาตั้งแต่ปี 2003 แล้ว แต่จนบัดนี้ mysql ก็ไม่สนใจจะทำออกมา ไม่เข้าใจว่าทำไม......หรือทำออกมาแล้วแต่ผมไม่รู้



Tag : PHP, MySQL









ประวัติการแก้ไข
2012-04-27 07:21:02
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2012-04-27 06:54:19 By : mr.v View : 3538 Reply : 10
 

 

No. 1



โพสกระทู้ ( 5,146 )
บทความ ( 26 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์


แล้วเก็บข้อมูลเป็นอะไรหละครับ Int varchar tinyint

ถ้าเป็น varchar ก็ convert มันเป็น int ก่อนค่อยจัดเรียงก็ได้

ORDER BY CAST(`myid` AS SIGNED) DESC






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-27 08:02:56 By : deawx
 


 

No. 2



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


ข้อมูลเป็น varchar ครับ

ถ้าใช้ cast มันก็ไม่ได้อยู่ดี เพราะมันจะออกมาเป็น
cat1
cat2
cat3
cat19
cat04
cat5
ยิ่งกว่าเก่าอีกครับ
แล้วข้อมูลตรง field name นี้บางทีก็จะกรอกเป็น text ล้วนๆ บางทีก็ปนตัวเลข มั่วๆกันไปน่ะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-27 08:22:33 By : mr.v
 

 

No. 3

Guest


ถ้า format ไม่แน่นอนก็ยากที่จะเรียง
อาจจะ query ออกมาแล้วเขียน code เรียงอีกที่
โดยแยก ตัวเลขกับตัวอักษร ตัวเลขก็แปลงเป็น int
แล้ว sort ด้วยตัวอักษร แล้ว sort ด้วยตัวเลขอีกที
น่าจะใช้ได้นะ

** SQL มันพอทำได้รึป่าวไม่รู้ครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-27 08:28:09 By : rootElement@kmutnb
 


 

No. 4



โพสกระทู้ ( 1,095 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์


อย่างนี้ได้ไหมครับ

SELECT * FROM table ORDER BY CONVERT(name USING tis620) ASC
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-27 09:11:53 By : ไวยวิทย์
 


 

No. 5



โพสกระทู้ ( 5,146 )
บทความ ( 26 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์


ถ้ามันยาก ผมว่าอย่าเก็บคำว่า cat เลยครับ

ถ้าอยากใส่ เอาไว้ตอน Query ออกมา แล้วค่อยมาวนลูปตัวเลขใส่คำว่า cat เอาจะง่ายกว่า

หรือว่า มันมีนัยยะอื่นที่จำเป็นต้องใ้ช้คำว่า cat ครับผม
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-27 09:27:03 By : deawx
 


 

No. 6



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


CONVERT() ไม่ได้ช่วยอะไรน่ะครับ


คำว่า cat มันเป็นแค่ตัวอย่างครับคุณเดี่ยว คือข้อมูลตรงนี้จะคาดเดาไม่ได้เลยว่าจะกรอกอะไรลงไปบ้าง แต่ที่กรอกลงไปควรออกมาตามลำดับตัวอักษร ascending แบบภาษามนุษย์ครับ

ผมลองดูสคริปของชาวบ้านและของนอกแต่ละตัว ดูเหมือนมีปัญหานี้กันหมดเลย คือมันไม่สามารถจัดเรียงแบบมนุษย์ทำได้ ไม่เข้าใจทำไม mysql ละเลยปัญหานี้

พวก sql อื่นๆเป็นกันไหมครับ อย่าง mssql, access, ???
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-27 10:31:45 By : mr.v
 


 

No. 7



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


ถ้าส่งออกมาจากฐานข้อมูลทำเป็น array แล้วใช้ natsort() มันจะเรียงออกมาได้เป๊ะเลยนะ
แต่ว่า ถ้าข้อมูลเยอะมากๆ มันต้องแบ่งหน้า ซึ่งตอนนั้นมันจะใช้วิธีนี้ไม่ได้อีก ถึงเอามาใช้ได้โดยการยัดข้อมูลทั้งหมดลง array แล้ว natsort() แล้วแบ่งหน้าแบบ array มันก็เปลือง memory มีปัญหาเรื่องประสิทธิภาพเปล่าๆ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-27 10:36:32 By : mr.v
 


 

No. 8



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


http://stackoverflow.com/questions/153633/natural-sort-in-mysql
มีคนโพสต์โค้ดเอาไว้ตามนี้ ผมไม่รู้จะเอามาใช้ยังไง เลยไม่รู้มันจะเวิร์คมั้ย
author: scarsick
Code (VB.NET)
/**
 * Returns a string formatted for natural sorting. This function is very useful when having to sort alpha-numeric strings.
 *
 * @author Alexandre Potvin Latreille (axp058)
 * @param {nvarchar(4000)} string The formatted string.
 * @param {int} numberLength The length each number should have (including padding). This should be the length of the longest number. Defaults to 10.
 * @param {char(50)} sameOrderChars A list of characters that should have the same order. Ex: '.-/'. Defaults to empty string.
 *
 * @return {nvarchar(4000)} A string for natural sorting.
 * Example of use: 
 * 
 *      SELECT Name FROM TableA ORDER BY Name
 *  TableA (unordered)              TableA (ordered)
 *  ------------                    ------------
 *  ID  Name                    ID  Name
 *  1.  A1.                 1.  A1-1.       
 *  2.  A1-1.                   2.  A1.
 *  3.  R1      -->         3.  R1
 *  4.  R11                 4.  R11
 *  5.  R2                  5.  R2
 *
 *  
 *  As we can see, humans would expect A1., A1-1., R1, R2, R11 but that's not how SQL is sorting it.
 *  We can use this function to fix this.
 *
 *      SELECT Name FROM TableA ORDER BY dbo.udf_NaturalSortFormat(Name, default, '.-')
 *  TableA (unordered)              TableA (ordered)
 *  ------------                    ------------
 *  ID  Name                    ID  Name
 *  1.  A1.                 1.  A1.     
 *  2.  A1-1.                   2.  A1-1.
 *  3.  R1      -->         3.  R1
 *  4.  R11                 4.  R2
 *  5.  R2                  5.  R11
 */
CREATE FUNCTION dbo.udf_NaturalSortFormat(
    @string nvarchar(4000),
    @numberLength int = 10,
    @sameOrderChars char(50) = ''
)
RETURNS varchar(4000)
AS
BEGIN
    DECLARE @sortString varchar(4000),
        @numStartIndex int,
        @numEndIndex int,
        @padLength int,
        @totalPadLength int,
        @i int,
        @sameOrderCharsLen int;

    SELECT 
        @totalPadLength = 0,
        @string = RTRIM(LTRIM(@string)),
        @sortString = @string,
        @numStartIndex = PATINDEX('%[0-9]%', @string),
        @numEndIndex = 0,
        @i = 1,
        @sameOrderCharsLen = LEN(@sameOrderChars);

    -- Replace all char that has to have the same order by a space.
    WHILE (@i <= @sameOrderCharsLen)
    BEGIN
        SET @sortString = REPLACE(@sortString, SUBSTRING(@sameOrderChars, @i, 1), ' ');
        SET @i = @i + 1;
    END

    -- Pad numbers with zeros.
    WHILE (@numStartIndex <> 0)
    BEGIN
        SET @numStartIndex = @numStartIndex + @numEndIndex;
        SET @numEndIndex = @numStartIndex;

        WHILE(PATINDEX('[0-9]', SUBSTRING(@string, @numEndIndex, 1)) = 1)
        BEGIN
            SET @numEndIndex = @numEndIndex + 1;
        END

        SET @numEndIndex = @numEndIndex - 1;

        SET @padLength = @numberLength - (@numEndIndex + 1 - @numStartIndex);

        IF @padLength < 0
        BEGIN
            SET @padLength = 0;
        END

        SET @sortString = STUFF(
            @sortString,
            @numStartIndex + @totalPadLength,
            0,
            REPLICATE('0', @padLength)
        );

        SET @totalPadLength = @totalPadLength + @padLength;
        SET @numStartIndex = PATINDEX('%[0-9]%', RIGHT(@string, LEN(@string) - @numEndIndex));
    END

    RETURN @sortString;
END

GO

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-27 11:48:23 By : mr.v
 


 

No. 9



โพสกระทู้ ( 3,844 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์
Twitter Facebook

ตอบความคิดเห็นที่ : 2 เขียนโดย : mr.v เมื่อวันที่ 2012-04-27 08:22:33
รายละเอียดของการตอบ ::
Code (PHP)
$varcharID = "cat01";  // สมมุติน่ะครับ

//จาก Query ด้านล่าง จะได้ 1 ไปทำการ order by น่ะครับ  SUBSTR(varcharID,4,(LENGTH(varcharID))) หมายถึง
// เอา string เริ่มจากตำแหน่ง 4 ไปถึง จำนวน length $varcharID

$sql = "select * from table where condition order by cast(SUBSTR(varcharID,4,(LENGTH(varcharID))) as DECIMAL)";


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-27 14:50:39 By : mangkunzo
 


 

No. 10



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 9 เขียนโดย : mangkunzo เมื่อวันที่ 2012-04-27 14:50:39
รายละเอียดของการตอบ ::
ข้อมูลมันไม่ตายตัวน่ะครับ ใช้แบบนี้เจอข้อมูลรูปแบบอื่นๆเข้าไปก็ใช้ไม่ได้เหมือนกัน


สรุปแล้วคงไม่มีคำสั่ง sort order แบบภาษามนุษย์จริงๆ.....งั้นเพิ่ม field orders ขึ้นมาแล้วให้มนุษย์จัดเรียงเอาเองซะเลย แก้ปัญหาเรื่องประสิทธิภาพความเร็วของโปรแกรมได้ด้วย
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-27 22:07:56 By : mr.v
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : mysql sort order แบบภาษามนุษย์ มีวิธี"จริงๆ"ไหมครับ?
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 03
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่