PDA

View Full Version : قرار دادن شماره ردیف به ازای هر رکورد



php_love
سه شنبه 21 شهریور 1391, 13:03 عصر
سلام دوستان

برای مشخص کردن رتبه کاربران , تو دستور مای اس کیو ال امتیازشون رو بر اساس نزولی DESC مرتب کردم و شد مثلا این :

+------+--------+
|Score | User |
+------+--------+
| 3459 | 117 |
| 3432 | 85 |
| 693 | 70 |
| 450 | 215 |
| 388 | 300 |
+------+--------+


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

+------+--------+
R |Score | User |
+------+--------+
1 | 3459 | 117 |
2 | 3432 | 85 |
3 | 693 | 70 |
4 | 450 | 215 |
5 | 388 | 300 |
+------+--------+

اما از اونجایی که یاد نداشتم این امر چطوری صورت میگیره بعد از سلکتی که زدم با php این دستور رو نوشتم



$query = Select_Winners();
$i = 1;
while($item = mysql_fetch_assoc($query))
{
Update_Winner($i,$item["User_Id"]);
$i++;
}


اما مشکلی که دارم اینکه از اونجایی که تعداد کاربرا خیلی بالاست , سرور فقط می تونم 40% از امتیاز کاربرا رو محاسبه کنه و بقیه کاربرا بدون امتیاز می مونن .

البته این دستور هم هست :

SET @row:=0;
SELECT @row:=@row + 1,... FROM



اما این دستور شماره واقعی رکورد تو دیتا بیس رو نشون میده مثلا میشه این :

+------+--------+
R |Score | User
+------+--------+
115 | 3459 | 117
5 | 3432 | 85
81 | 693 | 70
32 | 450 | 215
43 | 388 | 300
+------+--------+


دیگه نمی دونم چی کار کنم . گفتم از دستور LIMIT استفاده کنم , اما برای این امر حتما باید شماره ردیف تو خروجی مای اس کیو ال باشه .

شدیدا به کمک احتیاج دارم . ..

Hr.Ziggurat
سه شنبه 21 شهریور 1391, 13:44 عصر
اگه منظورتو درست فهمیده باشم ، اینجوری خیلی راحت میشه این کارو کرد :

<table><tr><td>R</td><td>Score</td><td>ID</td></tr>
<?php
... //Connect and Select db
$mss = "SELECT * FROM users_table ORDER BY Score DESC;";
$result = @mysql_query($mss);
$cnt = @mysql_num_rows($result);
$i=0;
while($i<$cnt){
$ui = @mysql_result($result,$i,"User_Id");
$us = @mysql_result($result,$i,"User_Score");
$i++;
echo "<tr><td>$i</td><td>$us</td><td>$ui</td></tr>";
}
... //Close Connection and ...
?>
</table>
اگه بازم مشکلی بود بگو...

php_love
سه شنبه 21 شهریور 1391, 14:17 عصر
دوسته عزیزم ببین من نمی خوام با php و با حلقه ای که به وجود میارم رتبه کاربرا رو مشخص کنم , اگه دقت کرده باشی اون بالا خودم هم یه نمونه مثال زدم , به دلیل اینکه تعداد کاربرا زیاده سرور جواب نمیده . من می خوام داخل همون کوئری که نوشتی یه ستون دیگه ایجاد بشه و شماره ردیف رو بزنه .
تو این کوئری یه ستون دیگه درست بشه و شماره ردیف به ترتیب نزولی زده بشه .

SELECT *,یک ستون اینجا قرار بگیره و شماره ردیف بخوره
FROM users_table
ORDER BY Score DESC

Hr.Ziggurat
سه شنبه 21 شهریور 1391, 16:43 عصر
مطمئن باش تنها راهی که واسه داشتن شماره ی ردیف توی کوئری وجود دارد همون چیزی که خودتم گفتی :


mysql_query("SET @R:=0;");
$mss = "SELECT *,@R:=@R+1 AS RowNumber FROM users_table ORDER BY Score DESC;";
$result = mysql_query($mss);

متغییر @R به ازای هر ردیف 1 واحد بالا میره و RowNumber میشه شماره ی ردیف. واقعاً عجیبه که میگی درست کار نمیکنه...
تازه بعد از گرفتن result بازم باید یه حلقه داشته باشی که ردیف هارو توجدول بذاری ، یعنی بازم یه حلقه لازمه. پس اگه اون کد php خودت فقط 40 درصد داده هارو میده ، این روشم همین نتیجه رو داره.
احتمالا تنها خطایی که ممکنه به خاطر زیاد بودن ردیفا پیش بیاد timeout (اگه خطایی دیگست بگو). که اگه حالت safe_mode خاموش باشه ، میتونی با دستور set_time_limit مقدار timeout رو بیشتر از 30 ثانیه کنی. در غیر این صورت تنها راحت همون گذاشتن LIMIT . نمیدوم این جدول رو واسه چی می خوای ولی میتونی با LIMIT جدولت رو صفحه بندی کنی ($si شماره ی شروع ردیفه) :


mysql_query("SET @R:=$si;");
$mss = "SELECT *,@R:=@R+1 AS RowNumber FROM users_table ORDER BY Score DESC LIMIT $si,".(10+$si); // Insert 10 Row Into Each Row
$result = mysql_query($mss);