PDA

View Full Version : order by قبل از limit



tabib_m
سه شنبه 07 شهریور 1385, 17:09 عصر
با سلام
چطوری میتونم موقع select کردن ، کاری کنم که قبل از این که دستور limit و یا group by انجام بشه ، order by انجام بشه!
اگه ما یه جدول داشته باشیم با رکورد های زیر


ID NAME
----------------
1 Mohsen
2 Ali
3 Sadeq
4 Bahram
5 Naser

در صورتی که دستور زیر رو بدیم:


SELECT * FROM `TABLENAME` WHERE 1 ORDER BY `NAME` LIMIT 3

نتیجه این میشه:


2 Ali
1 Mohsen
3 Sadeq

در صورتی که من نتیجه ی زیر رو میخوام:


2 Ali
4 Bahram
1 Mohsen


امیدوارم منظورم رو متوجه شده باشید

hamed_m
پنج شنبه 09 شهریور 1385, 06:32 صبح
WHERE 1 رو بردارید باید درست عمل کنه.

tabib_m
پنج شنبه 09 شهریور 1385, 09:21 صبح
منظورم از where 1 این بود که یه شرطی هم داریم
نمیتونم از شرطم صرف نظر کنم.

hamed_m
پنج شنبه 09 شهریور 1385, 09:58 صبح
با هر شرطی باشه درست کار میکنه. شرط رو بفرمایید شاید ایراد از شرط باشه.


نکته: من گاهی بر خوردم که WHERE صحیح عمل نمیکنه از HAVING استفاده کنید ببنید مشکل حل میشه. البته ممکنه مشکل از جای دیگه باشه که من نمیدونم.

tabib_m
پنج شنبه 09 شهریور 1385, 16:31 عصر
آخه به where چه ربطی داره؟؟؟
مشکل با limit و order by هستش
میشه بیشتر توضیح بدید؟؟

hamed_m
پنج شنبه 09 شهریور 1385, 21:49 عصر
ربطی نداره. ببخشید.

tabib_m
پنج شنبه 09 شهریور 1385, 23:43 عصر
ربطی نداره. ببخشید.
ناراحت شدید از حرفم؟
واقعا قصدی نداشتم
معذرت میخوام
اگه بیشتر توضیح بدید ممنون میشم.

hamed_m
جمعه 10 شهریور 1385, 08:49 صبح
نه. تنها چیزی که به خاطرم رسید گفتم. چون تا بحال ندیدم لیمیت و اردر بای مشکل داشته باشند. عذر خواهی هم بخاطر این بود که در مورد چیزی که دقیق نمیدونستم اظهار نظر کردم.
برقرار باشید.

tabib_m
جمعه 10 شهریور 1385, 18:00 عصر
ممنون به خاطر کمکی که کردید
دوستان دیگه نمیتونن کمک کنن؟
بابا چیزی که اینجا زیاده ، حرفه ای :)

reza_rad
شنبه 11 شهریور 1385, 10:52 صبح
من تست کردم و چنین مشکلی ندارم!!!

hamed_m
شنبه 11 شهریور 1385, 11:43 صبح
ایراد باید از جای دیگه باشه. اردر بای و لیمیت مشکلی ندارند.

tabib_m
شنبه 11 شهریور 1385, 13:36 عصر
ببخشید
معذرت میخوام
اشتباهی سوالم رو پرسیدم
مشکل من با limit نیست ، فقط با group by هست.
واقعا شرمنده
مشکل اینجاس که اول عمل group by صورت میگیره ، و بعد عمل order by
اگه منظورم رو متوجه نمیشید ، بگید مثال بزنم.

باز هم معذرت میخوام به خاطر اشتباهی که کردم. :(

reza_rad
شنبه 11 شهریور 1385, 13:57 عصر
خواهش می کنم:)



شکل اینجاس که اول عمل group by صورت میگیره ، و بعد عمل order by
اگه منظورم رو متوجه نمیشید ، بگید مثال بزنم.

ولی این منطق درسته...



اگه منظورم رو متوجه نمیشید ، بگید مثال بزنم.

مثال بزن...

tabib_m
شنبه 11 شهریور 1385, 17:06 عصر
ولی این منطق درسته...
من هم نمیگم غلطه ، میگم من برعکسش رو نیاز دارم. برای کار بالعکس باید چیکار کنم؟؟
حالا مثال:
فرض کنید که یک فیلد دیگه هم داریم ، به نام Birthday (روز تولد) :



ID NAME Birthday
----------------------------
1 Mohsen 1367
2 Ali 1369
3 Sadeq 1350
4 Ali 1320
5 Bahram 1370
6 Naser 1349
7 Mohsen 1365
8 Naser 1353
9 Ali 1368
10 Sadeq 1347


و من میخوام ، group by Name بکنم ، و order by Birthday
در اینجا ، در صورتی که عمل group_by صورت بگیره ، نتیجه این میشه:



ID NAME Birthday
----------------------------
1 Mohsen 1367
2 Ali 1369
3 Sadeq 1350
5 Bahram 1370
6 Naser 1349


و بعد که سورت میشه ، نتیجه این میشه:



ID NAME Birthday
----------------------------
2 Ali 1369
5 Bahram 1370
1 Mohsen 1367
6 Naser 1349
3 Sadeq 1350


ولی من میخوام اول عمل سورت انجام بشه ، و بعد group by صورت بگیره ، یعنی:

عمل order by :



ID NAME Birthday
----------------------------
4 Ali 1320
10 Sadeq 1347
3 Sadeq 1350
6 Naser 1349
8 Naser 1353
7 Mohsen 1365
1 Mohsen 1367
9 Ali 1368
2 Ali 1369
5 Bahram 1370


و سپس عمل group by :



ID NAME Birthday
----------------------------
4 Ali 1320
10 Sadeq 1347
6 Naser 1349
7 Mohsen 1365
9 Ali 1368
5 Bahram 1370


حالا اگر نتایج رو مقایسه کنید میبینید که با هم فرق دارن!
و من نیاز به این دارم که به نتیجه ی دوم برسم
باید چه کار کنم؟

پیشاپیش از کمکهاتون ممنون

نتیجه ی دیگه ای که بهش رسیدم اینه که در مورد limit ابتدا عمل order by صورت میگیره ، و بعد عمل limit صورت میگیره، و علت گیج شدن بنده هم همین بود ، چون این مسئله هم به صورد دیگه حال منو گرفته. لطفا راهنمایی کنید.

پ.ن: میدونم فکر میکنید که "حالا این یارو چه سوالایی میکنه" :) ولی بی خیال ، نیازمندم ، لطفا کمکم کنید.

hamed_m
شنبه 11 شهریور 1385, 19:22 عصر
با یه ساب کوئری ممکنه مشکل حل بشه. از سایت mysql.com:



If you want to use ORDER BY before GROUP BY, the only way I've found to achieve it is with a subquery.

For example, if you want to get a list of users from a table UserActions sorted according to the most recent action (based on a field called Time) the query would be:

SELECT * FROM (SELECT * FROM UserActions ORDER BY Time DESC) AS Actions GROUP BY UserID ORDER BY Time DESC;

Without the subquery, the group is performed first, and so the first record that appears in the database (which is not necessarily in the order you want) will be used to determine the sort order. This caused me huge problems as my data was in a jumbled order within the table.

--Edit--
This same result can be achieved with the use of MAX(Time), so the query would be:

SELECT *, MAX(Time) AS LatestAction GROUP BY UserID ORDER BY LatestAction DESC;

As far as I can see, the subquery model still holds up if you need more complex sorting before performing the GROUP.


باید برای کوئری خودتون اصلاحش کنید.

tabib_m
یک شنبه 12 شهریور 1385, 11:23 صبح
سلام
بسیار ممنون از کمکتون
میدونم راهی که معرفی کردید درسته
ولی یه مشکلی دارم
کوئری ای که من میدم اینه :


SELECT * FROM (select * from `test` where 1 order by `Birthday`) as test group by `Name`

بر اساس اون مثالی که زده ، باید درست باشه! ولی نتیجه ی نهایی یه ریزه عجیبه
نگاه کنید ، کاری که این دستور کرده اینه که اول اومده رکوردها رو برعکس چیده ، اون ها رو گروپ کرده و بعد بر اساس نام سورت کرده!!!!

reza_rad
یک شنبه 12 شهریور 1385, 13:57 عصر
فکر کنم جواب یکه نوشتی می خوای بهش برسی سطر یکی مونده به آخرش اضافیه.درسته؟

حالا من با یه کوئری اینو در آوردم.
ببین همینو می خوای؟


SELECT name, min( birthday ) AS temp1
FROM `tabib`
GROUP BY name
ORDER BY temp1



جواب:


name temp1
ali 1320
sadeq 1347
naser 1349
mohsen 1365
bahram 1370

tabib_m
دوشنبه 13 شهریور 1385, 12:08 عصر
:) ممنون
دقیقا همین رو میخواستم :)