View Full Version : سوال: مشکل با ایجاد یک کوئری
maysam.m
دوشنبه 23 اسفند 1389, 13:02 عصر
سلام
من 2 جدول پست و دسته دارم:
در جدول پستها یک فیلد اختصاص دادم به دسته ها و آی دی دسته ها رو در صورتی که چند تا باشند با "," جدا می کنم و وارد جدول میکنم به این صورت:
1,3,4,5
بعضی پستها یک دسته برایش انتخاب شده است و بعضی پستها چند دسته. وقتی میخوام پستهایی رو با آی دی مثلا 4 نشان بدم به مشکل برمیخورم.
کوئری هایی که امتحان کردم.
SELECT * FROM `post` WHERE `post_category_id` = '$category_id'
SELECT * FROM `post` WHERE `post_category_id` LIKE '%$category_id%'
با دستور like هم امتحان کردم اما به درستی جواب نداد. به نظر شما برای نمایش پستهایی با یک دسته ی خاص، از چه کوئری استفاده کنم که به مشکل نخورم؟
Example:
Post Table:
post_id,post_content,post_category_id
Category Table:
category_id,category_name
king-net
دوشنبه 23 اسفند 1389, 13:37 عصر
اول دسته هات رو بگیر بریز تو یه آرایه بعد با explode جداشون کن و اون موقعه تطبیق بده
$ M 3 H R D A D $
دوشنبه 23 اسفند 1389, 13:50 عصر
میتونی موقع درج اطلاعات در فیلد دسته ها اونارو صورت کنی بعنی 1 ویرگول 2 بعد 3 بعد 4
بعد اینجوری میفهمی پوزیشنش چنده
تو sql ؟_؟_ ازین دستوراتم داریم که مثلا بگی چند کاراکتری باشه و کتاراکتر اول هرچی میخواد باشه د.ومی چیز خاص باشه و ووووووووووووووو
maysam.m
دوشنبه 23 اسفند 1389, 17:45 عصر
سلام
اول دسته هات رو بگیر بریز تو یه آرایه بعد با explode جداشون کن و اون موقعه تطبیق بده
یک دسته بیشتر نیست.
میتونی موقع درج اطلاعات در فیلد دسته ها اونارو صورت کنی بعنی 1 ویرگول 2 بعد 3 بعد 4
بعد اینجوری میفهمی پوزیشنش چنده
تو sql ؟_؟_ ازین دستوراتم داریم که مثلا بگی چند کاراکتری باشه و کتاراکتر اول هرچی میخواد باشه د.ومی چیز خاص باشه و ووووووووووووووو
میشه یه مثال بزنید؟ :متفکر:
ممکنه توی پست یه موضوع بیشتر انتخاب نشه و در یک پست 10 تا موضوع انتخاب بشه و معلوم نیست که این آی دی دسته ی خاص در کجا قرار خواهد گرفت؟ ممکنه یه بار اول باشه یه بار آخر یه بار وسط ...
محتوای جدولمون مثلا اینطوری است:
post_id post_content post_category_id
1 "test text1" 1,3,4,7,8
2 "test text2" 2,4,6
3 "test text3" 5
4 "test text4" 1,7,4,8
5 "test text5" 5,7,4
6 "test text6" 3
حالا میخواهیم محتوای پستی که post_category_id = 4 را نشان بدهیم. باید به چه صورت کوئری بگیریم؟ :متفکر:
amir001
دوشنبه 23 اسفند 1389, 18:03 عصر
قبل و بعد از هر دسته را یک ویرگول بذار
1 "test text1" ,1,3,4,7,8,
بعد با این دستور انخاب کن:
SELECT * FROM `post` WHERE `post_category_id` like '%,$category_id,%'
تست کن ببین میشه.
اگر نشد از عبارات منظم هم میتونی استفاده کنی ، خود mysql پردازش عبارات منظم را برای جستجو داره.
امیـرحسین
دوشنبه 23 اسفند 1389, 23:39 عصر
اولا مشکل اصلی استفاده از لیستهای اینجوری همینی هست که بهش بر خوردید باید از جدوال واسط استفاده میکردید.
در هر صورت از تابع FIND_IN_SET (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set) استفاده کنید
SELECT * FROM `post` WHERE FIND_IN_SET('$category_id', post_category_id) > 0;
maysam.m
سه شنبه 24 اسفند 1389, 12:44 عصر
سلام
بسیار ممنون از دوستان به خصوص جناب «امیـرحسین» عزیز، با دستور FIND_IN_SET مشکل حل شد.
فقط یه سوال میشه یه مختصر توضیحی درباره جداول واسط بدهید؟
امیـرحسین
سه شنبه 24 اسفند 1389, 20:14 عصر
مثلا سه تا جدول رو به شکل زیر میسازید و جدول سوم میشه واسطه جدولهای اول و دوم:
posts: id, content
categories: id, name
posts_categories: post, category
وقتی مثلا پست شماره 5 به دستههای شماره 9 و 10 تعلق داره دو تا سطر توی جدول posts_categories ثبت میکنید:
posts | category
---------------------
5 | 9
5 | 10
و موقع پیدا کردن پستهایی که عضو دستهی خاصی هستند مشابه زیر عمل میکنیمک
SELECT posts.* FROM posts_categories
LEFT JOIN posts ON posts.id=posts_categories.post
WHERE posts_categories.category='10'
GROUP BY posts_categories.post
و یا دستههای یک پست خاص:
SELECT categories.* FROM posts_categories
LEFT JOIN categories ON categories.id=posts_categories.category
WHERE posts_categories.post='5'
GROUP BY posts_categories.category;
این روش که روش مرسوم هست بالاترین انعطاف رو برای این اهداف داره.
maysam.m
چهارشنبه 25 اسفند 1389, 11:28 صبح
فکر کنم بهتره ساختار جدولم رو تغییر بدم و از این روش استفاده کنم. :قلب:
ماشاا.. اطلاعات شما در سطح خیلی خوبیه :لبخندساده:
واقعا ممنونم :لبخندساده:
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.