PDA

View Full Version : سوال: تشخیص تکراری بودن کلمه واکشی شده از دیتابیس



majid1605
پنج شنبه 16 آبان 1392, 01:04 صبح
سلام از طریق یک فرم تگ مطالب رو از کاربر دریافت می کنم .تگ ها با فاصله از هم جدا میشن.به طور مثال برای دو مطلب مختلف "pdo دیتابیس prepare " "pdo prepare mysql" حالا هر چندتا که کاربر وارد کنه .تگ ها به همین صورت در پایگاه داده ذخیره میشن و موقع چاپ اونها رو جدا می کنم (impload) و نمایش میدم . تا اینجای قضیه مشکلی ندارم .اما نیاز دارم که همه تگ های تمام مطالب رو فراخوانی کنم به صورتی که غیر تکراری باشند یعنی هرتگ فقط یکبار تکرار بشه چطور می تونم اینکار رو انجام بدم. تووی مثال بالا موقع فراخوانی دو کلمه pdo prepare تووی هر دو مطلب تکرار شده بنابراین من فقط می خوام یکبار نمایش داده بشن . در ضمن چون به طور مکرر نمایش داده میشه برای همین ممنون میشم به پرفرمنس هم توجه داشته باشید.

فرزند کوروش
پنج شنبه 16 آبان 1392, 09:51 صبح
خروجی رو تو ارایه بریز بعد ارایه های تکراری رو حذف کن

majid1605
پنج شنبه 16 آبان 1392, 11:19 صبح
شما فرض کنید این جدول تگ شامل هزار رکورد باشه من هربار باید این رکوردها رو بریزم تووی یک آرایه و تمام عناصر آرایه رو چک کنم که تکراری نباشن حالا هر فیلد خودش شامب سه کلمه باشه یعنی یک آرایه 3000تایی که باید این سه هزار با هم مقایسه بشن و محتویاتشون تکرار نباشه. راهی که من بلدم اینه که عنصر اول با 2999 عنصر بعدی مقایسه و هر عنصر باهاش برابر باشه حذف بشه و عنصر دوم هم به همین ترتیب و.... اگه تعداد رکوردها بشه 100000 و هر رکورد شامل 10کلمه باشه چه اتفاقی میفته؟ اگه راه بهتری هست ممنون میشم ارائه بدید.

ابوذر محمودی
پنج شنبه 16 آبان 1392, 13:50 عصر
اولین کار اشتباهتون اینه که :

تگ ها به همین صورت در پایگاه داده ذخیره میشن
لزومی نداره تگ های تکراری ذخیره بشن ، یکیش باید ذخیره شه .
عمل حذف تکراری ها باید هنگام درج تو دیتابیس صورت بگیره ، فرض کنین این عمل روی هزار تا تگ باید اعمال شه ، که زمان نسبی مثلاً 5 ثانیه صرف اون میشه.
اگه موقع درج تو دیتابیس این عمل انجام شه ، فقط یکبار انجام میشه ، و کل زمان مصرفی 5 ثانیه هست. time=5
حالا اگه موقع نمایش بخواین این کارو بکنین به ازای هر بازدید 5 ثانیه باید صرف شه : time=Visit*5


حالا اگه تو دیتابیستون پره از این داده های تکراری ، رکورد هارو مجبورین یکی یکی بخونین و داده های تکراریشو یا با حلقه یا با دستور array_unique حذف کنین.

حالا اگه تازه میخواین داده هارو بریزین تو دیتابیس از دستور array_unique برای حذف تکراری ها استفاده کنین ، و یا اینکه خودتون یه چیزی مثل هش تیبل بسازین و مقادیرو توش بریزین.
مثال واسه دستور array_unique :


$a=array("salam","chetori?","hi","salam","hi","how r u","salam","salam","how r u","how r u");
print_r( array_unique($a));

خروجی :

Array ( [0] => salam [1] => chetori? [2] => hi [5] => how r u )

majid1605
پنج شنبه 16 آبان 1392, 15:42 عصر
وقتی یک مطلب ذخیره میشه همراهش تگ های متناظرش نیز تووی یه جدول دیگه ذخیره میشه موقع نمایش مطلب زیر مطالب تگ ها نمایش داده میشه و کارههای دیگه ایی که بر اساس تگ ها صورت می گیره .برای همین نمی تونم تکراری ها رو حذف کنم . یعنی به جزء استفاده از آرایه راه دیگه ایی وجود نداره؟

ابوذر محمودی
پنج شنبه 16 آبان 1392, 15:51 عصر
وقتی یک مطلب ذخیره میشه همراهش تگ های متناظرش نیز تووی یه جدول دیگه ذخیره میشه
چه لزومی داره که تگ ها همونطور که از کاربر دریافت میشه تو بانک ذخیره شه؟؟

majid1605
پنج شنبه 16 آبان 1392, 15:53 عصر
خب من سه راه بیشتر به ذهنم نرسید یکیش همون بالایی که گفتم دوتای دیگه که هرکدوم یه ایرادی دارند : فرض کنید یک جدول با چهار ستون تعریف کنیم که یکی ای دی مطلب و سه تای دیگه تگها (حداکثر سه تگ وارد بشه) حالا یا باید کاربر رو مجبور کنیم حتما سه تگ وارد کنه که این کار فکر نمی کنم کار درستی باشه یا اینکه هر تعداد که وارد کرد قبول کنیم در اینصورت اگر یدونه وارد کنه بقیه ستونها خالی باقی می مونند که تووی مباحث پایگاه داده اینهم کار درستی نیست . یک راه دیگه هم اینه که جدول دو ستونه باشه یکی تگ و یکی ای دی مطلب باشه اگه کاربر یدونه وارد کرد یک رکورد و اگه چندتا تگ وارد کرد چند رکورد با یک ای دی یکسان (مطلب)در جدول ذخیر میشن .که تنها بدیش شاید تعداد بالای رکوردها باشه . حالا به نظر شما روش بهینه تری هست ؟

ابوذر محمودی
پنج شنبه 16 آبان 1392, 16:25 عصر
شما هر روشی هم که به ذهنتون برسه قبل از اینکه تگ هارو ذخیره کنین باید تگ های تکراری رو حذف کنین.

حالا روش پیشنهادی من اینه که یه جدول برای تگ ها بسازین در ساده ترین حالت سه تا فیلد داشته باشه ، tag_id , post_id , tag

البته اینطوری هم میشه عمل کرد که برای هر مطلب یه رکورد اضافه شه ، منتهی تگ ها با یه کاراکتر از هم جدا شن بعد موقع نمایش اونارو بر اساس اون کاراکتر جدا کنی و نمایش بدی،که البته ممکنه بهینه نباشه .

majid1605
پنج شنبه 16 آبان 1392, 17:59 عصر
روشس که آخر گفتید همین روشیه که تووی پست اول اشاره کردم و کارکتر space رو مد نظر قرار دادم . اما اینکه تگ های اضافی رو حذف کنم گفتم که هر مطلبی تگ های خودش رو داره و ممکنه با یک مطلب دیگه تووی چند تگ با هم مشترک باشند. تووی خیلی از cms ها و یا سایتها همینطوره یعنی هر مطلب تگ های مربوط به خودش رو داره سایت http://stackoverflow.com رو نگاه کنید تووی همین صفحه اول چندتا تگ تکراری وجود داره برای هر مطلب هم جداگانه است. مطالب بر اساس همین تگ ها دسته بندی شدند و ممکنه یک سوال در چند بخش باشه.

ابوذر محمودی
پنج شنبه 16 آبان 1392, 18:18 عصر
ببخشید ببخشید من درست متوجه منظورتون نشده بودم ، من فکر کردم میخوان تگ های تکراری رو برای یک مطلب حذف کنین ، واسه همین متعجب بودم که چرا موقع درج این کارو انجام نمیدین.
شما میخواین همه تگ هارو تو یک صفحه نمایش بدین که تکراری هم نباشه ؟
خب اگه از روش جدول جدا برای تگ ها استفاده کنی تو خود کوئری میتونی داده های تکراری رو از نتیجه حذف کنی.

اینطوری:

select tag_id,tag,post_id
from tag_table
group by tag

majid1605
پنج شنبه 16 آبان 1392, 18:51 عصر
ظاهرا منظورم رو متوجه نشدید من می خوام از یک جدول به صورت زیر اطلاعات رو واکشی کنم که تکراری هم نباشند یعنی راهی باشه که کلمات تکرار شده رو حذف کنم و اگر ساختار جدول اشتباه است ساختار بهتری رو پیشنهاد بدید. حالا می خوام همه داده های ستون تگ رو واکشی کنم و تکراری ها حذف بشن . من می خوام خروجی من بشه html php sql css

MMSHFE
پنج شنبه 16 آبان 1392, 19:23 عصر
بجای اینهمه طولانی کردن مسائل، درمورد دستور SELECT DISTINCT در MySQL و دستور array_unique در PHP جستجو کنید. با ترکیب این دستورات با دستوراتی مثل explode و implode میتونید کاری که میخواین رو انجام بدین.

ابوذر محمودی
پنج شنبه 16 آبان 1392, 20:03 عصر
ظاهرا منظورم رو متوجه نشدید من می خوام از یک جدول به صورت زیر اطلاعات رو واکشی کنم که تکراری هم نباشند یعنی راهی باشه که کلمات تکرار شده رو حذف کنم و اگر ساختار جدول اشتباه است ساختار بهتری رو پیشنهاد بدید. حالا می خوام همه داده های ستون تگ رو واکشی کنم و تکراری ها حذف بشن . من می خوام خروجی من بشه html php sql css

متوجه منظورتون شدم ، دقت کنین گفتم بهتون که اگه از روش جدول جدا برای تگ ها استفاده کنی تو خود کوئری میتونی داده های تکراری رو از نتیجه حذف کنی.
یعنی اگه ساختار جدولتو عوض کنی میتونی اینکارو با همون دستور بالا که دادم انجام بدی.
با این ساختار فعلی جدولتون هر رکورد رو که واکشی میکنی کلشو به صورت رشته میخونه ، و بنابراین با کوئری نمیشه حذف کردشون مگه اینکه همشو بخونی با array_unique کار کنی .

من روش پیشنهادی رو گفتم بهتون ، تگ ها تو جدول جدا.

majid1605
پنج شنبه 16 آبان 1392, 20:32 عصر
از اون دو روش که در پست 7 اشاره کردم کدوم یکی بهتره ؟روش بهتری نسبت به اون دوتا وجود داره؟


بجای اینهمه طولانی کردن مسائل، درمورد دستور SELECT DISTINCT در MySQL و دستور array_unique در PHP جستجو کنید. با ترکیب این دستورات با دستوراتی مثل explode و implode میتونید کاری که میخواین رو انجام بدین.


با این دستورات تا حدودی آشنا هستم ولی استفاده از آرایه برای همچین کاری فکر کنم پرفرمنس رو پایین میاره و من دنبال یه کار بهینه هستم
ممنون

ابوذر محمودی
جمعه 17 آبان 1392, 07:00 صبح
از اون دو روش که در پست 7 اشاره کردم کدوم یکی بهتره ؟روش بهتری نسبت به اون دوتا وجود داره؟
با توجه به کاری که شما میخوان انجام بدین بهتره جدول جداگانه برای تگ ها بسازین ، چرا ؟ چون گفتم بهتون ، اینطوری با خود کوئری که به بانک میزنین تکراری ها حذف میشن . که این کار هم با group by بر اساس فیلد تگ میشه و هم دستور DISTINCT روی فیلد تگ ؛ ولی ازونجایی که اگه بخواین همراه با فیلدی که DISTINCT برمیگردونه فیلد دیگه ای هم داشته باشین یکم کوئری مشکل تر میشه ، میتونید با همون group by این کارو انجام بدین.

شما اگه ساختارتو عوض کنی فقط با همین دستور زیر میتونی تکراری ها رو حذف کنی :
select tag_id,tag,post_id
from tag_table
group by tag


دقت کنین که هر سوالی که میپرسین جوابش قبلا داده شده.
من ایده ای جز اینکه جدولتونو جدا کنید ندارم ، میتونید منتظر بمونید دیگران ایده بدند ، یا اینکه :
به CMS های وردپرس و جوملا و .. رجوع کنید و ساختار اون هارو هم بررسی کنید .

majid1605
جمعه 17 آبان 1392, 11:40 صبح
اگه جداول تبدیل به سه جدول بشه چی ؟
1-جدول تگ که شامل تگ ها به صورت یونیک باشه 2-جدول مطالب 3-جدول تگ مطالب
اولی فقط دو فیلد id و tag که تگها در صورت غیر تکراری بودن ذخیره میشن
سومی هم تگ های هر مطلب هستند که یک فیلد اون post-id و فیلد دیگه رو نمیدونم چطور پایه ریزی کنم؟تگهایی که کاربر وارد می کنه به صورت رشته ذخیره کنم (که فکر می کنم خیلی بهتره چون با دستور ساده like میشه حتی مطالب رو بر اساس یک تگ هم واکشی کرد و... ) یا ....
فقط می مونه نحوه ذخیره سازی جدول اول (تگ) چه روشی واسه مطمئن شدن از وارد شدن غیر تکراری تگ ها در جدول استفاده کنم؟
کل تگ ها رو واکشی و در یک آرایه بریزم و با تگ های وارد شده بررسی کنم؟یه روش که پرفرمنس بالای داشته باشه می خوام
ممنون

siavash82i
شنبه 21 اردیبهشت 1398, 16:21 عصر
سلام دوستان من میخوام محتوای تکراریمو حذف کنم و از array_unique استفاده میکنم و قطعه کدی که نوشتمو میزارم ولی همچنان محتوای تکراری من در خروجی نشون داده میشه!




$result2 = $db->sql_query("SELECT DISTINCT keyword FROM ".$prefix."_blog where keyword!='' and active=1 order by keyword asc");
while (list($keyword) = $db->sql_fetchrow($result2)) {
$names = explode('،',$keyword);
$names_unique = array_unique($names);
$ttgo = str_replace(" ", "-", $names_unique[0]);

$out1 .= "<li><a href='".$site_url."search/".$ttgo."/'>".$names_unique[0]."</a></li>\n";

}


بهترین شرکت طراحی سایت (http://www.rahkarenovin.com/) طراحی سایت بیمارستان (http://www.rahkarenovin.com/page/102/) ثبت دامنه ارزان (http://www.rahkarenovin.net/domains/)

ali_sed
دوشنبه 23 اردیبهشت 1398, 11:18 صبح
سلام دوستان من میخوام محتوای تکراریمو حذف کنم و از array_unique استفاده میکنم و قطعه کدی که نوشتمو میزارم ولی همچنان محتوای تکراری من در خروجی نشون داده میشه!


سلام لطفا سوالتان را در یک تاپیک جدید بپرسید