PDA

View Full Version : سوال: sort کردن يه فيلد با استفاده از دستور sql



imanitc
دوشنبه 22 مهر 1392, 10:26 صبح
يه فيلد دارم که توي اون اسامي ذخيره شده از A1 تا A100 تا E100 بصورت نا منظم وارد شده بصورت زير

A1
A20
B1
B12
C1
A4
B5
C2
ّA10
B90
A120 .....E100
ميخاستم با استفاده از دستور sql اين ها رو طوري سورت کنم که همه A پهلوي هم به ترتيب بيان بعد B,C,..

MMSHFE
دوشنبه 22 مهر 1392, 11:06 صبح
ALTER TABLE `table_name` ORDER BY `field_name`

imanitc
دوشنبه 22 مهر 1392, 16:47 عصر
با تشکر جناب شهرکی نمیخام توی تیبل دستکاری بشه فقط موقع نمایش میخام با سورت های معمولی نمایش درست نمیشه نمایش به این صورت میشه
A1,A10,A100,A11,A111,...

MMSHFE
دوشنبه 22 مهر 1392, 17:26 عصر
SELECT * FROM `table_name` ORDER BY `field_name`

رضا قربانی
دوشنبه 22 مهر 1392, 18:02 عصر
SELECT * FROM `table_name` ORDER BY `field_name` asc
or
SELECT * FROM `table_name` ORDER BY `field_name` desc

field_name = همون A تا E100....

imanitc
دوشنبه 22 مهر 1392, 18:35 عصر
با تشکر از دوستان
بابا اینا رو بلدم همه رو نتونستم فایل اسکیو ال بذارم حتی زیپش :گریه:
ببینید تیبل 2 تا فیلد یه فیلا AI یا همون ID یه فیلد هم همون نام یه ماده مثلا، اینا مواد رو به ترتیب وارد نکردن حالا از من توقع دارن به ترتیب نشون بدم عکسش رو میذارم 111864
مشکل اینجاس هر کاری میکنم به ترتیب نمیشه یعنی باید طول و الفبا و عدد رو سورت کرد امیدوارم منظورم رو متوجه شده باشید
با توجه به عکس باید مقادیر A41 ,..قبل از A97 قرار بگیرن

MMSHFE
دوشنبه 22 مهر 1392, 20:11 عصر
شما از جدولتون یک Export بگیرین و فایلش رو اینجا بگذارین تا روی دیتای خودتون مشکل رو برطرف کنیم.

imanitc
دوشنبه 22 مهر 1392, 21:32 عصر
111871
این فایل اس کیو ال مشکل فایر وال بود آپ نمیشد
ممنون

MMSHFE
دوشنبه 22 مهر 1392, 22:37 عصر
SELECT * FROM `drug` ORDER BY `drugname`
من این کوئری رو اجرا کردم، همه چیز رو مرتب نشون داد. البته باید دقت کنید که چون فیلد drugname شما از نوع متنی هست، مرتب سازی بصورت متنی اعمال میشه نه عددی. یعنی A109 قبل از A11 میاد چون کارکتر به کارکتر مقایسه میشه و کارکتر سوم A109 یعنی صفر، قبل از کارکتر سوم A11 یعنی 1 هست و درنتیجه A109 کوچکتر از A11 درنظر گرفته میشه. اگه بخواین این مشکل رفع بشه، باید اسامی رو با طول یکسان درنظر بگیرین و قبل از اونهایی که طول کمتر دارن، به تعداد کافی صفر بگذارین. مثلاً A11 به A011 تبدیل بشه و A1 به A001 و...

imanitc
دوشنبه 22 مهر 1392, 23:38 عصر
راهی نداره بدون دستکاری توی دیتا ها اونها مرتب نشون داد ؟

MMSHFE
سه شنبه 23 مهر 1392, 01:18 صبح
راستش الآن راهی به ذهنم نمیرسه چون متن و عدد با هم قاطیه. حالا اگه حروف رو توی یک فیلد جدا بگذارین و اعداد توی یک فیلد جدا از نوع int باشن، با یک ORDER BY مرکب، میشه درستش کرد. حتی میشه توی خروجی با CONCAT دو فیلد رو ادغام کرد و بصورت یک فیلد نشون داد.

imanitc
سه شنبه 23 مهر 1392, 09:24 صبح
ممنون از لطفتون ببينم ميتونم دستور اس کيو ال پيدا کنم اين کار جدا سازي عدد و حروف انجام بده بعد اونا رو سورت کنم مشکل اينجاس که ديتا نبايد جابجا و دستکاري بشن با کد پي اچ پي ميشه 3 سوت اين کار رو کرد ميخام اسکيو الي انجام بدم

MMSHFE
سه شنبه 23 مهر 1392, 10:40 صبح
بیا آقا نگرد:

SELECT `DGID`, CONCAT(`Letter`, '', `Digit`) AS `DrugName`
FROM (
SELECT `DGID`, SUBSTRING(`DrugName`, 1, 1) AS `Letter`, CONVERT(SUBSTRING(`DrugName`, 2), UNSIGNED INTEGER) AS `Digit`
FROM `drug`
ORDER BY `Letter`,`Digit`
) AS `temp`

imanitc
سه شنبه 23 مهر 1392, 11:06 صبح
با تشکر فراوان
من اين روش هم پيدا کردم ولي فکر کنم مال شما بهينه تر باشه

SELECT
*,
MID(DrugName, 1, 1) AS s,
INET_ATON(
CONCAT(
MID(DrugName, 2, 1),
MID(DrugName, 3, 1),
MID(DrugName, 4, 1)
)
) AS d
FROM
drug
ORDER BY s,d

رضا قربانی
سه شنبه 23 مهر 1392, 12:54 عصر
شما با php و دستورات رگولار اکسپرشن هم می تونید متن رو از حروف جدا کنید و با تابع Xplod بیایید همه رو بریزید توی آرایه و بر اساس آرایه Sort کنید .

MMSHFE
سه شنبه 23 مهر 1392, 13:46 عصر
مسئله اینه که میخوان توی خود MySQL اینکار انجام بشه و سمت PHP نیاد چون سرعت کاهش زیادی پیدا میکنه.