• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
چطوری جستجویی برای تعویض کالا به کالا با اولیت بندی داشته باشم؟
#1
سلام

من یه مشکلی سر کوئری گرفتن از دیتابیس و چاپ اون دارم میخواستم از شما بزرگواران راهنمایی و کمک بگیرم


شخص اول ثبت میکنه:
کالا فروشی: دسته: موبایل - زیرمجموعه : سامسونگ
قابل تعویض با: لپ تاپ ، کامپیوتر، تبلت

شخص دوم ثبت میکنه:
فروش: دسته: موبایل - زیرمجموعه :سونی
قابل تعویض با: هارد، چاپگر، تبلت


شخص سوم جستجو میکنه:
کالا فروشی: تبلت
کالای خریداری: موبایل - اولویت اول: سونی - اولویت دوم: سامسونگ

یه موتور جستجو باشه که اطلاعات رو از دیتابیس به صورت زیر در بیاره:

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

منتظر راهنمایی های شما بزرگواران هستم
  پاسخ
تشکر شده توسط :
#2
لطفا ساختار جدوالتون رو هم قرار بدین. (به فرم دستورات sql)
به یـزدان که گر ما خرد داشتیم
کجـا این سر انجـام بد داشتیم؟
  پاسخ
تشکر شده توسط : hossein7441
#3
هنوز ساختار خاصی برای جدول در نظر نگرفتم
میخواستم یه نمونه ساده برای نشون دادن این نوع کوئری باشه

بذارید شفاف تر منظورمو بیان کنم:
چطور وقتی میخواهیم کوئری بگیریم میتونیم با دستور ORDER BY `id` DES به صورت نزولی دربیاریم. منم میخوام وقتی کوئری میگیره همونجا سه تا شرط رو بررسی کنه که اگه فیلد `cat_sale` فروشنده ای که ثبت کرده با $cat_buy خریدار یکی باشد (یعنی حتما دسته ها برابر باشند سپس اولویت زیر مجموعه ها حساب بشه، اینجا یعنی دسته ی گوشی موبایل) و اگه `object-sale` برابر $object_priority1 بود در آرایه ای که قراره برگردونه در ابتدای اون قرار بگیره و اگه برابر $object_priority2 بود بعد از اولیت اولی قرار بگیرد و به همین ترتیب اگر هیچ کدوم نبود بعد از آنها در آرایه قرار بگیرد و بعد با دستور foreach هم از آرایه پیمایش یا چاپ کنم!

من یه نمونه کدی پیدا کردم که به نظرم نزدیک به خواسته ی منه فقط میخواستم مثل موردی که من بیان کردم با توضیح بهم بگید به چه صورته:

http://stackoverflow.com/questions/49560...d-priority
کد پی‌اچ‌پی:
SELECT
  FirstName
,
  
LastName,
  IF (
FirstName LIKE '%Microsoft%' || LastName LIKE '%Microsoft%'10) AS One,
  IF (
FirstName LIKE '%John%' || LastName LIKE '%John%'10) AS Two
FROM alumni
ORDER BY One DESC
Two DESC 

و

کد پی‌اچ‌پی:
$queryappend="ORDER BY
   length(firstname) - levenshtein(FirstName, '"
.$searchitems[$i]."') +
   length(lastname)  - levenstein(LastName, '"
.$searchitems[$i]."')   +
   length(City)      - levenstein(City, '"
.$searchitems[$i]."')       +
   ... 
  پاسخ
تشکر شده توسط :
#4
به خاطر این گفتم ساختار جداول، چون نوع کوئری بستگی به ساختار جدوال داره.
مثلا وقتی شما فیلد "قابل تعویض با" رو بصورت رشته ای در نظر بگیرید، میتونید از موتور جدول myisam و توابع fulltext استفاده کنید.
یا وقتی فیلد "قابل تعویض با" رو بصورت کلید خارجی در میارید و لینک به جدول دیگر میدین. کوئری متفاوت میشه مثلا میتونید از left join و ... استفاده کنید.

در ضمن این کوئری کل ردیف های جدول رو برمیگردونه!
نقل قول:Note that this demonstrates the algorithm, it it not tuned for performance.
به یـزدان که گر ما خرد داشتیم
کجـا این سر انجـام بد داشتیم؟
  پاسخ
تشکر شده توسط :
#5
(۱۳۹۴ فروردین ۰۸, ۰۵:۵۹ ب.ظ)sara147 نوشته: به خاطر این گفتم ساختار جداول، چون نوع کوئری بستگی به ساختار جدوال داره.
مثلا وقتی شما فیلد "قابل تعویض با" رو بصورت رشته ای در نظر بگیرید، میتونید از موتور جدول myisam و توابع fulltext استفاده کنید.
یا وقتی فیلد "قابل تعویض با" رو بصورت کلید خارجی در میارید و لینک به جدول دیگر میدین. کوئری متفاوت میشه مثلا میتونید از left join و ... استفاده کنید.

در ضمن این کوئری کل ردیف های جدول رو برمیگردونه!
نقل قول:Note that this demonstrates the algorithm, it it not tuned for performance.

ممنون از پاسخ شما.
اما میخواستم از همون inodb استفاده کنم.
نمیشه از شرط توی کوئری استفاده کرد؟ البته مستونم بعد از کوئری گرفتن با ساتفاده از دستورات شرطی دوباره روی چندتا آرایه دیگه برگردونم بعد اونارو استفاده کنم اما میخواستم روش کار رو بدونم و اصولی تر انجام بشه
  پاسخ
تشکر شده توسط :
#6
کد:
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='sony'
UNION
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='samsung'
به یـزدان که گر ما خرد داشتیم
کجـا این سر انجـام بد داشتیم؟
  پاسخ
تشکر شده توسط : hossein7441
#7
(۱۳۹۴ فروردین ۱۰, ۱۱:۴۹ ق.ظ)sara147 نوشته:
کد:
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='sony'
UNION
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='samsung'

ممنون از شما.
همون کاری که میخواستم رو انجام داد.
  پاسخ
تشکر شده توسط :
#8
(۱۳۹۴ فروردین ۱۰, ۱۱:۴۹ ق.ظ)sara147 نوشته:
کد:
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='sony'
UNION
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='samsung'

سلام
یه کمک دیگه برای این کد شما نیاز داشتم.
میخواستم این کوئری که شما نوشتید رو به صورت نزولی با توجه به تاریخ لیست کنم اما نمیشه به صورت عادی از ORDER BY `date` DESC استفاده کرد.
میخواستم توی همون برند سونی آخرین کالای جدیدی که وارد شده در اول قرار بگیره ولی وقتی از ORDER BY `date` DESC استفاده میکنم دیگه اولویت اینکه سونی در ابتدا قرار بگیره و توی خود سونی با توجه به تاریخ، درست جواب نمیده

ممنون میشم اگه توی این مورد هم کمکم کنید
  پاسخ
تشکر شده توسط :
#9
کد:
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='sony' ORDER BY `date` DESC
UNION
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='samsung' ORDER BY `date` DESC
یا
کد:
SELECT * FROM
(SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='sony'
UNION
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='samsung')
ORDER BY `date` DESC
به یـزدان که گر ما خرد داشتیم
کجـا این سر انجـام بد داشتیم؟
  پاسخ
تشکر شده توسط : hossein7441
#10
(۱۳۹۴ فروردین ۱۴, ۱۱:۲۹ ب.ظ)sara147 نوشته:
کد:
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='sony' ORDER BY `date` DESC
UNION
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='samsung' ORDER BY `date` DESC
یا
کد:
SELECT * FROM
(SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='sony'
UNION
SELECT * FROM `exchange` WHERE `item_name`='tablet' AND `item_brand`='samsung')
ORDER BY `date` DESC

هر دونوعی که ذکر کرده اید قبلا تست کردم اما درست نبودن.

روش اول خطای زیر رو میده:
کد:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1221 Incorrect usage of UNION and ORDER BY' in C:\wamp\www\xchange\inc\class.xchange.php on line 54
PDOException: SQLSTATE[HY000]: General error: 1221 Incorrect usage of UNION and ORDER BY in C:\wamp\www\xchange\inc\class.xchange.php on line 54

روش دوم هم بازخطای سینکتس داشت:

کد:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1248 Every derived table must have its own alias' in C:\wamp\www\xchange\inc\class.xchange.php on line 54
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1248 Every derived table must have its own alias in C:\wamp\www\xchange\inc\class.xchange.php on line 54
که با اضافه کردن dum بعد از پرانتز خطا رفع میشد اما ترتیب برندی به هم میخوره
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان