PDA

View Full Version : کوئری حذف داده های تکراری در mysql



yasgig
دوشنبه 21 تیر 1389, 18:22 عصر
با سلام
من یه بانک اطلاعاتی دارم که توش داده های تکراری ذخیره شده.حالا با group by content محتوا رو اگه تکراری بود یه بار نشون میده.حالا می خواستم بپرسم آیا کوئری موجود هست که تمام داده های تکراری رو حذف کنه و فقط یکی شون توی بانک اطلاعاتی بمونه؟چون حجم دیتابیس میره بالا به همین خاطر می خوام حذفشون کنم.در ضمن یه سوال دیگه هم داشتم و اونم اینه که معمولا توی هاست های اشتراکی حجم بانک اطلاعاتی چقدر هست؟(یعنی سرور چه مقدار از فضا رو به بانک اطلاعاتی اختصاص میده)
با تشکر

bestirani2
دوشنبه 21 تیر 1389, 18:42 عصر
به جای Selcet از select distinct استفاده کن تا داده های تکراری انتخاب نشند
بعد میتوانی آی دیشون رو توی یک String با کاما از هم جدا کنی و با استفاده از دستور پاک کردن به همراه in ، همه داده به غیر از این لیست رو حذف کنی تا تکراری ها پاک بشند
معمولاً هم 10% را به عنوان بانک اطلاعاتی در نظر میگیرند البته برای هاستهای لینوکس و هاست های ویندوز فضای بانک اطلاعاتی رو به عنوان یک پارامتر جدا در اطلاعات فروش درج میکنند

yasgig
دوشنبه 21 تیر 1389, 21:31 عصر
\س اگه هاست نامحدود باشه بانک اطلاعاتی هم نامحدود میشه دیگه؟آخه من از هاست نامحدود استفاده می کنم و یه بانک اطلاعاتی دارم که هر روز حجمش 400 مگابایت افزایش پیدا میکنه.

funpatogh
دوشنبه 21 تیر 1389, 21:41 عصر
دوست bestirani2 (http://barnamenevis.org/forum/member.php?u=91411) خوب اشاره کردند و بنده هم براتون نوشتم:لبخندساده:



<?php
$query=mysql_query("select distinct `Id` from `news` order by `Id` ")or die(mysql_error());
while($row=mysql_fetch_row($query)){
$list.="'$row[0]'".",";
}
$list=substr($list,0,strrpos($list,','));
$delete=mysql_query("delete from `news` where `Id` not in($list)")or die(mysql_error());

echo mysql_affected_rows()."deleted";

?>

bestirani2
دوشنبه 21 تیر 1389, 21:48 عصر
\س اگه هاست نامحدود باشه بانک اطلاعاتی هم نامحدود میشه دیگه؟آخه من از هاست نامحدود استفاده می کنم و یه بانک اطلاعاتی دارم که هر روز حجمش 400 مگابایت افزایش پیدا میکنه.
نا محدود بودن فقط یک جمله تبلیغاتی هستید
اگه واقعاً 400 مگابایت روزانه زیاد میشه پس بهتره یک سرور اختصاصی یا مجازی بگیرید
توی دیتابیس چی میریزی که ایقدر زیاد میشه
اگه عکس و ... رو داری وارد میکنی، از دیتابیس استفاده نکینی بهتر هست

yasgig
دوشنبه 21 تیر 1389, 22:22 عصر
من اخبار رو از خبرگزاری ها میگیرم و توی بانک اطلاعاتی ذخیره می کنم تا همیشگی بشه.
نمونه:http://yasgig.ir/news.php?site=isna
مثلا واسه ایسنا که هر دقیقه 100 تا از خبراش وارد بانک اطلاعاتی میشه پیشبینی میکنم تا 12 روز دیگر کلیه اخبار ایسنا وارد بانک اطلاعاتی من بشه.

<?php
$query=mysql_query("select distinct `Id` from `news` order by `Id` desc limit 0,50 ")or die(mysql_error());
while($row=mysql_fetch_row($query)){
$list.="'$row[0]'".",";
}
$list=substr($list,0,strrpos($list,','));
$delete=mysql_query("delete from `news` where `Id` not in($list)")or die(mysql_error());

echo mysql_affected_rows()."deleted";

?>
ممنون دوست عزیز ولی این کد هم کار نکرد.می می خوام بر اساس فیلد content مقایسه کنم و سپس پاکش کنم.این فیلد content هم از نوع text هست.کدت رو خوب نوشتی ولی فکر کنم یکم دستکاری نیاز داره.چون من هرچه قدر امتحان کردم و داده های تکراری توی فیلد content ریختم ولی بازم نوشت:0deleted
اگه فیلد content از نوع text نبود اصلا با خاصیت primary اجازه نمی دادم که داده های تکراری وارد بانک اطلاعاتی بشه.
ممنون میشم کمکم کنید تا داده ها رو حذف کنم.

bestirani2
دوشنبه 21 تیر 1389, 22:45 عصر
به هر حال حجم فایل متنی خیلی کمتر از این چیزی هست که گفتید
400 خبر 2 مگابایت میشه حدوداً
هاستتون رو از کجا گرفتید؟

funpatogh
دوشنبه 21 تیر 1389, 23:11 عصر
خوب قبل از ارسال خبر یک کوئری جستجو بنویس و ببین هستش یا نه اگه نبود خبر را insert کن

yasgig
دوشنبه 21 تیر 1389, 23:14 عصر
400 خبر 2 مگابایت میشه حدوداً
کی گفته 400 تا خبره؟ 2900 صفحه هست که توی هر صفحه 50 خبر نشون داده میشه.(به غیر از تکراری ها)
حالا امروز 2900 صفحه است.هر دقیقه دو صفحه بیشتر میشه.یعنی 100 خبر اضافه میشه.