PDA

View Full Version : سوال: مشکل با ایجاد یک کوئری



maysam.m
دوشنبه 23 اسفند 1389, 12: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, 12:37 عصر
اول دسته هات رو بگیر بریز تو یه آرایه بعد با explode جداشون کن و اون موقعه تطبیق بده

$ M 3 H R D A D $
دوشنبه 23 اسفند 1389, 12:50 عصر
میتونی موقع درج اطلاعات در فیلد دسته ها اونارو صورت کنی بعنی 1 ویرگول 2 بعد 3 بعد 4
بعد اینجوری میفهمی پوزیشنش چنده
تو sql ؟_؟_ ازین دستوراتم داریم که مثلا بگی چند کاراکتری باشه و کتاراکتر اول هرچی میخواد باشه د.ومی چیز خاص باشه و ووووووووووووووو

maysam.m
دوشنبه 23 اسفند 1389, 16: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, 17:03 عصر
قبل و بعد از هر دسته را یک ویرگول بذار


1 "test text1" ,1,3,4,7,8,

بعد با این دستور انخاب کن:


SELECT * FROM `post` WHERE `post_category_id` like '%,$category_id,%'

تست کن ببین میشه.

اگر نشد از عبارات منظم هم میتونی استفاده کنی ، خود mysql پردازش عبارات منظم را برای جستجو داره.

امیـرحسین
دوشنبه 23 اسفند 1389, 22: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, 11:44 صبح
سلام

بسیار ممنون از دوستان به خصوص جناب «امیـرحسین» عزیز، با دستور FIND_IN_SET مشکل حل شد.

فقط یه سوال میشه یه مختصر توضیحی درباره جداول واسط بدهید؟

امیـرحسین
سه شنبه 24 اسفند 1389, 19: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, 10:28 صبح
فکر کنم بهتره ساختار جدولم رو تغییر بدم و از این روش استفاده کنم. :قلب:
ماشاا.. اطلاعات شما در سطح خیلی خوبیه :لبخندساده:
واقعا ممنونم :لبخندساده: