View Full Version : لطفا راهنمایی کنید : انتخاب چند ردیف در دیتابیس
aszasz
دوشنبه 09 تیر 1393, 09:31 صبح
سلام دوستان من برای اینکه بهتر منظورم رو متوجه بشید یک عکس از دیتابیسم گرفتم لطفا ملاحظه کنید
120616
من می خوام دستوری بنویسم که بیاد بررسی کنه ستون uid را اگر یک عدد بیشتر از 300 بار تکرار شده بود بیاد بر اساس ستون time که sort کنه ردیف های بیشتر از 300 را پاک کنه
نمیدونم منظورم رو رسوندم یا نه خیلی پیچیده ی :اشتباه:
یک مثال بزنم که منظورم رو دوستان متوجه بشن :
مثلا توی این عکس uid=41 دو بار تکرار شده می خوام اگر بیشتر از 300 بار تکرار شده باشه هر ردیفی که بیشتر از 300 هست پاکشون کنه البته بر حسب زمان یعنی قدیمی ترین ردیف ها رو پاک کنه
همچین کد select اگر کسی بتونه بنویسه ممنون میشم یا شاید هم کدی تو در تو باشه که خودش هم select کنه هم delete :کف: من زیاد حرفه ای نیستم لطفا کمک کنید خیلی دیتابیسم سنگین میشه نیاز دارم با این روش یخورده سبکش کنم
MMSHFE
دوشنبه 09 تیر 1393, 10:29 صبح
با ترکیب PHP و MySQL راحتتر میتونید کار کنید. برای مثال:
$moreThan300Ids = mysql_query('SELECT `uid`,COUNT(*) AS `total` FROM `table` GROUP BY `uid` HAVING `total` > 300');
if($moreThan300Ids) {
while($row = mysql_fetch_assoc($moreThan300Ids)) {
for($i = 0; $i < (300 - $row['total']); $i++) {
mysql_query("DELETE FROM `table` WHERE (`uid`='{$row['uid']}') ORDER BY `time` LIMIT 1");
}
}
}
الان این کد میاد اول uidهایی که تعدادشون بیشتر از 300 تا هست رو پیدا میکنه و بعد یک حلقه میگذاره و از اول شروع میکنه به اندازه اختلاف تعداد با 300، رکوردها رو حذف میکنه.
aszasz
دوشنبه 09 تیر 1393, 12:09 عصر
با ترکیب PHP و MySQL راحتتر میتونید کار کنید. برای مثال:
$moreThan300Ids = mysql_query('SELECT `uid`,COUNT(*) AS `total` FROM `table` GROUP BY `uid` HAVING `total` > 300');
if($moreThan300Ids) {
while($row = mysql_fetch_assoc($moreThan300Ids)) {
for($i = 0; $i < (300 - $row['total']); $i++) {
mysql_query("DELETE FROM `table` WHERE (`uid`='{$row['uid']}') ORDER BY `time`");
}
}
}
الان این کد میاد اول uidهایی که تعدادشون بیشتر از 300 تا هست رو پیدا میکنه و بعد یک حلقه میگذاره و از اول شروع میکنه به اندازه اختلاف تعداد با 300، رکوردها رو حذف میکنه.
من کد رو قرار دادم قسمت اول که میاد اون یوزرهایی که بیشتر از 300 هست رو پیدا میکرد درست کار میکرد اما بخش دوم موقع پاک کردن میاد همه ردیف های اون یوزر رو پاک میکنه یعنی اگر 400 تا هست نمیاد 100 تا اضافه را پاک کنه میاد هر 400 تا رو پاک میکنه
توی اون حلقه هم که نوشتید به اون صورت اصلا کار نمی کرد اومدم 300 - $row رو به $row - 300 عوض کردم یعنی جاهاشون رو عوض کردم که حلقه درست بشه که باز میگم کلا میاد همه رو پاک میکنه
MMSHFE
دوشنبه 09 تیر 1393, 12:23 عصر
شرمنده یادم رفت توی کوئری داخلیه آخرش (بعد از `time`) عبارت LIMIT 1 رو اضافه کنید (کد رو اصلاح کردم).
aszasz
دوشنبه 09 تیر 1393, 12:24 عصر
با ترکیب PHP و MySQL راحتتر میتونید کار کنید. برای مثال:
$moreThan300Ids = mysql_query('SELECT `uid`,COUNT(*) AS `total` FROM `table` GROUP BY `uid` HAVING `total` > 300');
if($moreThan300Ids) {
while($row = mysql_fetch_assoc($moreThan300Ids)) {
for($i = 0; $i < (300 - $row['total']); $i++) {
mysql_query("DELETE FROM `table` WHERE (`uid`='{$row['uid']}') ORDER BY `time`");
}
}
}
الان این کد میاد اول uidهایی که تعدادشون بیشتر از 300 تا هست رو پیدا میکنه و بعد یک حلقه میگذاره و از اول شروع میکنه به اندازه اختلاف تعداد با 300، رکوردها رو حذف میکنه.
اقا مشکل رو متوجه شدم اون delete آخر یک محدودیت لازم داشت
در کل کد شد این :
$moreThan300Ids = mysql_query('SELECT `uid`,COUNT(*) AS `total` FROM `table` GROUP BY `uid` HAVING `total` > 300');if($moreThan300Ids) { while($row = mysql_fetch_assoc($moreThan300Ids)) { $num_row=$row['total']-300; mysql_query("DELETE FROM `table` WHERE (`uid`='{$row['uid']}') ORDER BY `time` LIMIT $num_row ");
}}
خیلی خیلی ممنون از کمکتون
MMSHFE
دوشنبه 09 تیر 1393, 12:43 عصر
آره این روش خودتون بهتره دیگه درگیر حلقه داخلی نمیشین.
aszasz
دوشنبه 09 تیر 1393, 13:08 عصر
آره این روش خودتون بهتره دیگه درگیر حلقه داخلی نمیشین.
اره گیر من همون select اول بود که شما زحمتش رو کشیدید
حالا یک چیزی اگر بخوام اون قسمت اول ردیف هایی رو بشماره که ستون archive =0 باشه باید این شرط رو کجاش اضافه کنم؟
این شکلی درسته ایا :متفکر:
SELECT `uid`,COUNT(*) AS `total` FROM `table` where 'archive' = 0 GROUP BY `uid` HAVING `total` > 300
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.