ورود

View Full Version : مرتب سازی دادها بر اساس یک رشته



majid1605
یک شنبه 09 شهریور 1393, 19:51 عصر
با استفاده از یک کوئری یک فیلد ایجاد و رشته ایی تولید می کنم که نتایج واکشی شده بر اساس اون مرتب می شوند .
بر فرض دو رشته زیر تولید شده باشند :
aaaaaaa0aaaaaaa1cccccc17
در جدول بالاتر از
aaaaaaa0aaaaaaa1ccccccc2
قرار میگیره درصورتی که اولی id=17 و دومی id=2 هست و مشخص هست که دومی باید بالاتر از اولی قرار بگیره

miladamirzadeh
سه شنبه 11 شهریور 1393, 11:20 صبح
منظور شما را دقیقاً متوجه نشدم، آیا شما صرفاً یک ORDER BY می خواهید؟ می شه خروجی مورد نظر و خروجی کنونی را بذارید؟ با تشکر.

majid1605
چهارشنبه 12 شهریور 1393, 15:23 عصر
دنبال مرتب سازی یک سری نتایج هستم با ORDER BY اینکار رو انجام دادم برای همین موقع واکشی این رشته رو بر اساس id , parentid ایجاد می کنم .
اگه یه واکشی مثل زیر داشته باشیم




+--------+----------------------------------+
|parentid| padded_path |
+--------+----------------------------------+
| 11 | aaaaaaa0aaaaaaa1cccccc11 |
| 11 | aaaaaaa0aaaaaaa1cccccc11bbbbbb12 |
| 17 | aaaaaaa0aaaaaaa1cccccc17 |
| 2 | aaaaaaa0aaaaaaa1ccccccc2 |
+--------+----------------------------------+



چون بر اساس رشته داره مرتب سازی صورت میگیره بنابراین ابتدا 1 و سپس عدد بعدی اگه موجود باشه برای مرتب سازی در نظر گرفته میشه
در صورتی که من میخوام به صورت زیر مرتب سازی صورت بگیره


+--------+----------------------------------+
|parentid| padded_path |
+--------+----------------------------------+
| 2 | aaaaaaa0aaaaaaa1ccccccc2 |
| 11 | aaaaaaa0aaaaaaa1cccccc11 |
| 11 | aaaaaaa0aaaaaaa1cccccc11bbbbbb12 |
| 17 | aaaaaaa0aaaaaaa1cccccc17 |
+--------+----------------------------------+

چون رکوردی که id کمتری داره به طور قطع باید بالاتر قرار بگیره

miladamirzadeh
چهارشنبه 12 شهریور 1393, 22:36 عصر
به نظر می رسه این راه حل شما باشه:

SELECT CONVERT(parentid,UNSIGNED INTEGER) AS parentid,padded_path
FROM table
ORDER BY parentid;

majid1605
جمعه 14 شهریور 1393, 00:28 صبح
اینجا رو نگاه کنید
http://sqlfiddle.com/#!2/20180/3
سه فیلد اخر باید قبل از id=13 قرار بگیرن

miladamirzadeh
جمعه 14 شهریور 1393, 09:28 صبح
چرا ORDER BY را به صورت

ORDER BY ID,padded_path

نمی نویسی؟ شخصاً اصلاً اسکریپت های پیچیده رو دوست ندارم. اگر بتونی با ساختن ویوهای مختلف اسکریپتتو ساده تر کنی، به درک اون توسط دیگران کمک کردی.

majid1605
جمعه 14 شهریور 1393, 11:09 صبح
بعضی مواقع نمیشه از پیچیدکی ها جلوگیری کرد.این کوئری هم سر داراز داره :متفکر:
از id نمیتونم استفاده کنم چون اگه به نتیجه ای که لینکش رو دادم توجه کنید id=10 ,id=11 باید دقیقا زیر id=1 بیان (فیلد type هم تاثیر داره) در جاهایی که parentid برابر باشند type=c به type=a اولویت داره و اگه type دوتا فیلد A و parentid یکسانی داشته باشند باز اگه یکی از همین type=A خودش چندتا فرزند داشته باشه type=C های اون باید قبل از type=A دوم بیادو....

miladamirzadeh
جمعه 14 شهریور 1393, 17:56 عصر
بعضی مواقع نمیشه از پیچیدکی ها جلوگیری کرد.این کوئری هم سر داراز داره :متفکر:
از id نمیتونم استفاده کنم چون اگه به نتیجه ای که لینکش رو دادم توجه کنید id=10 ,id=11 باید دقیقا زیر id=1 بیان (فیلد type هم تاثیر داره) در جاهایی که parentid برابر باشند type=c به type=a اولویت داره و اگه type دوتا فیلد A و parentid یکسانی داشته باشند باز اگه یکی از همین type=A خودش چندتا فرزند داشته باشه type=C های اون باید قبل از type=A دوم بیادو....
جالبه. خوب به نظرم با توجه به قوانین بالا واجبه که کوئریتو تیکه تیکه کنی.

majid1605
جمعه 14 شهریور 1393, 19:36 عصر
تیکه تیکه کردنش فکر نکنم کار درستی باشه چرا که اول باید یک دستور یکسری اطلاعات باید واکشی و تووی یک آرایه ذخیره و یا یک شی جدید برای پایگاه داده ایجاد واسه مرحله دوم هم همینطور یعنی وقتی از اطلاعات واکشی شد دوباره یا نتایج در ک ارایه جدید باید ذخیره و یا یک شی جدید ایجاد کرد فکر کنم اینجوری منابع سیستم به درستی مورد استفاده قرار نگیرن و ار اضافی روی سرور ایجاد بشه
یه کاری شبیه کد زیر



SELECT * from table where id=1;


While(..)
{
SELECT * from table where paentid=result[id];
}
while(..)
{
SELECT * from table where parentid=result1[id_result];
}