PDA

View Full Version : دریافت رتبه یک کاربر بر اساس یک ستون خاص در جدول



saleh700
شنبه 06 شهریور 1395, 14:01 عصر
سلام

من جدولی دارم به شرح زیر


من میخوام بای یک کوئری روی این جدول بفهمم جایی که user_name برابر هست با SALEH بر اساس مقدار درج شده در ستون user_point کاربر SALEH در جایگاه چندم قرار داره

تشکر

rambod18
شنبه 06 شهریور 1395, 15:56 عصر
select row_number() over (order by user_point) as rw from your-table-name where user_name ="saleh"

saleh700
شنبه 06 شهریور 1395, 16:19 عصر
درود بر شما
دقت کنید سوال رو در قسمت mysql پرسیدم در mysql دستوری به اسم row_number نداریم و این کد خطا میده

rambod18
شنبه 06 شهریور 1395, 16:32 عصر
set @point=0;
select *from(
select @point:=@point+1 as point ,user_name from tbl order by user_point desc) as p where p.user_name="saleh"

saleh700
شنبه 06 شهریور 1395, 17:44 عصر
خیلی ممنونم جواب داد و عالی کار میکنی فقط یک سوال:
این کوری اول تمام رکورد ها رو انتخواب میکنه بعد از داخل اون جایی که user_name برابر هست با saleh رو انتخاب میکنه ایا اگه تعداد کاربران مثلا 1000000 باشه به سرور فشار نمیاد؟

rambod18
شنبه 06 شهریور 1395, 17:52 عصر
برای تشکر از گزینه تشکر زیر پست استفاده .
خواهش میکنم قابلی نداشت
در کل هر کوری روی یک میلیون رکورد کوری سنگینی به حساب میاد.اما دستورات داخلی بهینه شده اند.
اگر فرض کنیم فشار میاره به سیستم،هرچقدر هم فشار بیاره بهتره از انجام این کار با برنامه نویسی هست.

saleh700
شنبه 06 شهریور 1395, 19:39 عصر
من این دستور رو وقتی مستقیم از داخل xampp اجرا میکنم درسته ولی وقتی از داخل php اجرا میکنم چیزی بر نمیگردونه اگه میشه یک نگاهی به کدم بندازید

$queryrank = "$queryrank = "set @point=0; select *from(select @point:=@point+1 as point ,user_name from tbl order by user_point desc) as p where p.user_name="saleh"";
$resultrank = @mysqli_query( $connect , $queryrank );

rambod18
شنبه 06 شهریور 1395, 19:48 عصر
مستقیم اجرا نکنید به صورت پروسیجر اجرا کنید نام کاربری رو هم به عنوان پارامتر ارسال کنید

saleh700
شنبه 06 شهریور 1395, 22:04 عصر
با پروسیجر هم جواب نمیده من به این صورت سعی کردم پروسیجر بسازم:

CREATE PROCEDURE `get_week_rank`(IN user_phone VARCHAR(200))
BEGIN
SET @row=0;
SELECT row from ( SELECT (@row := @row +1) as row , user_phone,user_cup
From user GROUP BY user_id
ORDER BY user_cup DESC) AS tbl WHERE tbl.user_phone=user_phone
END

اما ارور زیر رو میده:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 3

line 3 همون SET @row=0; هستش

rambod18
یک شنبه 07 شهریور 1395, 00:11 صبح
به جای set @row=0
از

DECLARE row INT DEFAULT 0;

استفاده کنید

saleh700
یک شنبه 07 شهریور 1395, 10:33 صبح
به صورت زیر نوشتم ولی همیشه 0 بر میگردونه!

CREATE PROCEDURE get_week_rank( IN _phone VARCHAR(20) )
BEGIN
DECLARE row INT DEFAULT 0;
SELECT row from ( SELECT (@row := @row +1) as row , user_phone, week_score
From user GROUP BY user_id
ORDER BY week_score DESC) AS tbl WHERE tbl.user_phone=_phone;
END$$

saleh700
یک شنبه 07 شهریور 1395, 10:44 صبح
در نهایت به این صورت نوشتم و درست شد

CREATE PROCEDURE get_week_rank( IN _phone VARCHAR(20) )
BEGIN
SET @row=0;
SELECT row from ( SELECT (@row := @row +1) as row , user_phone, week_score
From user GROUP BY user_id
ORDER BY week_score DESC) AS tbl WHERE tbl.user_phone=_phone;
END$$