• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
انتخاب مقدار یک ردیف مشخص در کوئری
#1
سلام،
من میخوام جای اینکه دو کوئری مختلف بنویسم تا به نتیجه برسم، میخوام مستقیم در یک کوئری (اگر امکانش باشه) مقدار یک ردیف مشخص رو در بیارم.
کد:
TABLE `mytable`
Columns `i`,`x`,`y`
Rows `z`,`o`,`p`

میخوام در کوئری مقدار o رو که مربوط به ستون x میشه بدست بیارم و در همون کوئری ازش استفاده کنم.


ویرایش شد: ببینید، من یک جدول دارم که توش سه ردیف(row) هست. من باید یک مقدار رو از اون سه ردیف بدست بیارم و با مقداری از دو ردیف دیگه مقایسه کنم. این کار با ارسال دو کوئری انجام میشه. اما در یک کوئری چطوری میتونم چنین چیزی بنویسم. اینم یه نمای ساده از اون چیزی که میخوام.
کد:
SELECT * FROM `table` WHERE `x`.value > `y.value && `x`.value < `u`.value


ممنونم Heart
غایب
  پاسخ
تشکر شده توسط :
#2
سوالت رو من درست متوجه نشدم
اگه یه خورده بیشتر توضیح بدی خیلی خوب میشه
  پاسخ
تشکر شده توسط :
#3
فکر کنم با group by و having بشه اینکارو کرد
  پاسخ
تشکر شده توسط :
#4
بهتر توضیح بده منم متوجه نشدم
  پاسخ
تشکر شده توسط :
#5
بهتر از این نمیتونم توضیح بدم. شما یکم روی اون چیزی که گفتم وقت بذار دقت کن متوجه میشی چی میخوام. یه مثالم حالا زدم ها. بذار یه جور دیگه بگم. الآن میخوای مقداری رو از جدولت در بیاری. باید واکشی کنی دیگه. درسته؟ میخوام بدون عمل واکشی در همون کوئری اون مقدار رو بدست بگیرم.
غایب
  پاسخ
تشکر شده توسط :
#6
خوب بیان نمی کنی
ولی هر چی هست یا باید join کنی یا اینکه باید از subselect استفاده کنی
  پاسخ
تشکر شده توسط :
#7
کد:
SELECT x,y,u FROM table WHERE x > (SELECT y FROM table WHERE z = 123) AND x < (SELECT u FROM table WHERE z = 123);
  پاسخ
تشکر شده توسط :
#8
رامین جان sql که دادی پرفرمونس خوبی نداره. آوردن select داخل where بار زیادی رو به دیتابیس تحمیل می کنه.
کد به این صورت بهینگی خیلی بهتری داره
کد:
SELECT t1.x,t1.y,t1.u FROM table as t1
    INNER JOIN table as t2 ON t2.z=123 and t1.x > t2.y and t1.x < t2.u
    groub by t1.id

البته کد رو تست نکردم.
  پاسخ
تشکر شده توسط :
#9
اول اینکه کاملا بستگی به نوع دیتابیس و ایندکس گذاری داره تجربه من می گه اصلا جوین برتری نداره گاهی خیلی بدتر می شه
دوم اینکه مهم انجام کار اگر پرفورمنس مهم باشه و علیرضا سوال داشته باشه می یاد مطرح می کنه و ما هم اکسپلین می گیریم و روش کار می کنیم Smile ولی خیلی به ندرت پیش میاد تو ایران کارهایی با ترافیک سنگین داشته باشیم دوستان تو تله ریزه کاری های این تیپی نیفتند!
  پاسخ
تشکر شده توسط :
#10
(۱۳۹۱ مرداد ۰۱, ۱۲:۲۵ ق.ظ)ramram نوشته: اول اینکه کاملا بستگی به نوع دیتابیس و ایندکس گذاری داره تجربه من می گه اصلا جوین برتری نداره گاهی خیلی بدتر می شه
دوم اینکه مهم انجام کار اگر پرفورمنس مهم باشه و علیرضا سوال داشته باشه می یاد مطرح می کنه و ما هم اکسپلین می گیریم و روش کار می کنیم Smile ولی خیلی به ندرت پیش میاد تو ایران کارهایی با ترافیک سنگین داشته باشیم دوستان تو تله ریزه کاری های این تیپی نیفتند!


نوع دیتابیس رو روی pgsql و sqlite و mysql که می دونم اینطوریه. و بستگی به ایندکس هم نداره. جوین همیشه بهتر از سابسلکت عمل می کنه. اگر نمونه ای مخالف ابن چیزی که دارم داری بگو خوشحال میشم یه تستی روش داشته باشم. البته با توجه به مقالات و تجربه ای که داشتم همیشه سریعتر هست. چون حجم بسیار کمتری رو در temp نگهداری می کنه و کنترل ایندکس راحتتره. توی subselect کوئری اپتیمایزر هیچ تلاشی رو برای حذف ساب سلکت نمی کنه و چون داخل قسمت where اومده مجبوره هر دو کوئری رو صدا بزنه و همه دیتای select رو واکشی کنه. تنها در شرایطی قادر به پاسخگویی سریع هست که شرط z=123 دیتای خیلی کمی رو برگردونه. ولی نمونه ای که ارائه کردم در صورت وجود مقادیر زیاد و قرار دادن ایندکس مناسب باز دیتابیس به سرعت قادر به پاسخگویی هست.
subselect استفاده های خاص خودش رو داره.
توی همین انجمن چندین تاپیک در مورد کند بودن همچین کوئری‌هایی بوده که با تصحیح در روش درست واکشی اطلاعات سرعت خیلی بالا رفته
  پاسخ
تشکر شده توسط :


پرش به انجمن:


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