PDA

View Full Version : سوال: چرا این کوئری ها کار نمی کنن؟



idocsidocs
جمعه 23 دی 1390, 22:07 عصر
چرا این کوئری جواب درست بر نمی گردونه؟

کوئری این ارور داده می شه:

Subquery returns more than 1 row in


$onlin_ip=time()-(15*60);
SELECT t1.*,(SELECT DISTINCT(`ip`) FROM `statistics`) AS ip1 FROM `statistics` AS t1 WHERE (`register_time`>'$onlin_ip')";

mbf5923
جمعه 23 دی 1390, 22:37 عصر
خوب دوست خوبم Select داخلیت بیش از یک مقدار برمیگردونه و برای Select خارجی مشکل ایجاد میکنه

idocsidocs
جمعه 23 دی 1390, 22:56 عصر
خوب دوست خوبم Select داخلیت بیش از یک مقدار برمیگردونه و برای Select خارجی مشکل ایجاد میکنه

اینو می دونم ولی راهی نیست که این مشکل رو برطرف کرد؟ شاید ساب کوئری چند سطر برگردونه، راه نیست که برای چنین موارد مشکل رو حل کرد؟

امیـرحسین
جمعه 23 دی 1390, 23:02 عصر
این دو تا SELECT هیج اثری رو هم ندارند. میتونید دو تا کوئری بگیرید! اگه محض سرعت میخواستید یه کوئری کنید، میتونید از توابع multiQuery استفاده کنید (مثلا mysqli_multiquery) یا Stored Procedure استفاده کنی یا حتی UNION کنی...

djsaeedkhan
شنبه 24 دی 1390, 00:06 صبح
سلام
می تونی توی سلکت داخلی یه لیمیت بزاری که هر کاری کرد و هر چند تا سطر پیدا کرد فقط یکیشو برگردونه

اینم یه راهه

idocsidocs
شنبه 24 دی 1390, 00:11 صبح
این دو تا SELECT هیج اثری رو هم ندارند.چرا هیچ اثری روی هم ندارن؟ یعنی اگر ساب کوئری چند ردیف رو بکشه بیرون، نمی شه از این نوع کوئری استفاده کرد؟


حتی UNION کنی... برای این کار (UNION ) باید چه کدی استفاده کنم؟

امیـرحسین
شنبه 24 دی 1390, 11:45 صبح
چرا هیچ اثری روی هم ندارن؟ یعنی اگر ساب کوئری چند ردیف رو بکشه بیرون، نمی شه از این نوع کوئری استفاده کرد؟

برای این کار (UNION ) باید چه کدی استفاده کنم؟
این دو تا کوئری تاثیری رو هم ندارند یعنی این کوئری شما با دو تا کوئری جدا فرقی نداره و میشه جداش کرد. این یه نمونه از SubQuery که روی خود کوئری تاثیر داره:
SELECT fld1, fld2 FROM tb1 WHERE fld3=(SELECT SUM(col1) FROM tbl2 WHERE col2=5);
(همینجا در مورد همین کوئری یک نکته بگم از این مدل SubQueryکه تو WHERE گذاشته میشه نباید زیاد ترسید چون ربطی به تعداد سطرها نداره و فقط یکبار اجرا میشه. یعنی فکر نکنید به ازای هر سطر،‌ MySQL میاد این SubQuery رو اجرا میکنه!)

UNION لقمه دور سر چرخوندنه مگه اینکه ساختار واقعا مجبورمون کرده باشه با یک کوئری همه‌چی رو داشته باشیم. شما اگه بگی دقیقا از این کوئری چه استفاده‌ای میخوای بکنی، میشه بهترین راه حل رو پیدا کزد. چون مثلا با یه LEFT JOIN ساده هم میشه مشکل رو حل کرد ولی کوئری شما یکم عجیبه!

idocsidocs
شنبه 24 دی 1390, 12:05 عصر
شما اگه بگی دقیقا از این کوئری چه استفاده‌ای میخوای بکنی، میشه بهترین راه حل رو پیدا کزد. چون مثلا با یه LEFT JOIN ساده هم میشه مشکل رو حل کرد ولی کوئری شما یکم عجیبه!
این کوئری توی بخش آمار سایت استفاده می شه. منمی خوام تعداد بازدیدکننده هایی که آی پی متفاوتی دارن و در 30 روز گذشته وارد سایت من شدن رو نمایش بدم.

امیـرحسین
شنبه 24 دی 1390, 12:18 عصر
SELECT * FROM statistics WHERE `register_time`>$onlin_ip GROUP BY ip;