PDA

View Full Version : سوال: استفاده از رند در query با 2 تیبل????



mosi2007
یک شنبه 27 فروردین 1391, 09:19 صبح
سلام
من از 2 تا تیبل اطلاعاتو میخونم از انتها و 20 تا ی اخری رو
حالا میخوام یکی از این 20 تا فیلد بصورت رند انتخاب بشه و همه این اطلاعات رو چاپ کنم
منتها نمیدونم چطوری باید از این 20 تا یه دونه رو بصورت رند انتخاب کنم و مهم تر این که چطوری و با چی بخونم وچطوری چاپ کنم؟؟؟؟؟؟؟؟؟
اگه میشه ادامه این کدو برام تکمیل کنید
مممنون


$get=mysql_query("SELECT images.image_id, images.album_id, images.timestamp, images.ext, images.image_title ,
users.user_id, users.name
FROM images
,users ORDER BY images.image_id DESC LIMIT 20

");

MMSHFE
یک شنبه 27 فروردین 1391, 22:10 عصر
میشه دقیقاً بگین منظورتون از رند، Round هست یا Rand و دیگه اینکه کدوم فیلد رو میخواین به این ترتیب انتخاب کنید؟

mosi2007
یک شنبه 27 فروردین 1391, 22:27 عصر
مرسی دوست عزیز
همین الان راه حلو پیدا کردم
در ضمن منظورم rand بود تازگی ها هم تو این فروم خیلی دیر به جواب میرسیم

mosi2007
دوشنبه 28 فروردین 1391, 15:59 عصر
استاد من از این تابع استفاده کردم برای rand ولی درست جواب نمیده مثلا 8 بار یه فیلدو نشون میده و 1 یا 2 بار فیلهای بعدی رو بصورت تصادفی میاره
این کدی که من استفاده میکردم


function random_row($table, $column) {

$max_sql = "SELECT " . $column . "

AS max_id

FROM " . $table/* ." ORDER BY ". $column." DESC LIMIT 20 "*/;

$max_row = mysql_fetch_assoc(mysql_query($max_sql));

$random_number = mt_rand(0, $max_row['max_id']);

$random_sql = "SELECT * FROM " . $table . "

WHERE " . $column . " >= " . $random_number . "

ORDER BY " . $column . " ASC

LIMIT 1";

$random_row = mysql_fetch_assoc(mysql_query($random_sql));

if (!is_array($random_row)) {

$random_sql = "SELECT * FROM " . $table . "

WHERE " . $column . " < " . $random_number . "

ORDER BY " . $column . " DESC

LIMIT 1";

$random_row = mysql_fetch_assoc(mysql_query($random_sql));

}
return $random_row;


}
print_r(random_row('images', 'image_id'));

MMSHFE
دوشنبه 28 فروردین 1391, 16:04 عصر
شرمنده ولی این کد خیلی بهم ریخته هست. البته نه اینکه نامرتب باشه، منتها من چون در جریان کل کار نیستم نمیدونم توش چی به چیه. اگه میشه ساختار جدول و اینکه دقیقاً چه نوع خروجی خاصی میخواین بگیرین رو مشخص کنید تا بتونم راهنمایی کنم. موفق باشید.

mosi2007
دوشنبه 28 فروردین 1391, 17:15 عصر
چشم
اول ما 2 تا تیبل داریم یکی به اسم images و دیگری به اسم users کاربرانی که تصویری اپلود میکنن مشخصات تصویر میره تو تیبل images به همراه user_id اون شخص
85845
این هم تیبل users
85846
خب تا اینجا که هیچی

بعد من میخاهم که تو این query


$get=mysql_query("SELECT images.image_id, images.album_id, images.timestamp, images.ext, images.image_title ,
users.user_id, users.name
FROM images
,users ORDER BY images.image_id DESC LIMIT 20

");

اول 20 تا image اخری رو از تو تیبل images انتخاب کنم به همراه name از تو تیبل users (به اصطلاح نام کاربران اون 20 تا کاربرانیکه انتخاب شدن ) که تا اینجا انجام دادم ولی مشکلم اینجاست
که بعد از تو این 20 تا یکی باید بصورت رندوم انتخاب بشه این از مشکل شماره 1
بعد این یه دونه فیلد که بصورت رندوم از بین اون 20 که انتخاب کردم با چه دستوری اطلا عاتشو بیارم بیرون با mysql_fetch_assoc ؟؟ ؟ اره ؟؟؟

AbiriAmir
دوشنبه 28 فروردین 1391, 17:35 عصر
میتونید از rand در sql استفاده کنید
البته 1جا خوندم سرعت کوئری رو پایین میاره اما به این صورت میتونید:
SELECT * FROM `xxxx` WHERE xxxxx ORDER BY RAND() LIMIT 1
این 1 سطر رندوم رو برمیگردونه

بله از mysql_fetch_assoc و mysql_fetch_array میتونید استفاده کنید

mosi2007
دوشنبه 28 فروردین 1391, 17:47 عصر
میتونید از rand در sql استفاده کنید
البته 1جا خوندم سرعت کوئری رو پایین میاره اما به این صورت میتونید:
SELECT * FROM `xxxx` WHERE xxxxx ORDER BY RAND() LIMIT 1
این 1 سطر رندوم رو برمیگردونه

بله از mysql_fetch_assoc و mysql_fetch_array میتونید استفاده کنید
عزیز اون رندی که شما انجام دادین از همه محتویات جدول یه دونه رو میگیره من میخوام که 20 تای اخری رو اول انتخاب کنم مثلا 100 تا row داریم که اول باید 20 تای اخری رو انتخاب کنه 80-100 رو بعد از این 20 تای اخری یکی رو بصورت rand انتخاب کنه

AbiriAmir
دوشنبه 28 فروردین 1391, 17:52 عصر
خوب با where میتونید دیگه...
یعنی id سطر 80 و id سطر 100 رو بدست میارین و خیلی ساده کوئریتون اینجوری میشه:
SELECT * FROM `xxxx` WHERE `id` BETWEEN '$id80' AND '$id100' ORDER BY RAND() LIMIT 1

mosi2007
دوشنبه 28 فروردین 1391, 18:26 عصر
خوب با where میتونید دیگه...
یعنی id سطر 80 و id سطر 100 رو بدست میارین و خیلی ساده کوئریتون اینجوری میشه:
SELECT * FROM `xxxx` WHERE `id` BETWEEN '$id80' AND '$id100' ORDER BY RAND() LIMIT 1

خب این کار درست
ولی من که نمیدونم که تو تیبل چند تا id است من بطور مثال 100 تا مد نظر گرفتم شما یه زحمتی بکشین اینو تغییر بدین طوری که همیشه 20 تای اخری رو انتخاب کنه و از اون 20 تا یکی رو بصورت rand انتخاب کنه

AbiriAmir
دوشنبه 28 فروردین 1391, 19:04 عصر
این رو امتحان کنید:
SELECT * FROM `tbl_name` WHERE `id` IN (SELECT `id` FROM `tbl_name` ORDER BY `id` DESC LIMIT 20) ORDER BY RAND() LIMIT 1

mosi2007
دوشنبه 28 فروردین 1391, 23:52 عصر
این رو امتحان کنید:
SELECT * FROM `tbl_name` WHERE `id` IN (SELECT `id` FROM `tbl_name` ORDER BY `id` DESC LIMIT 20) ORDER BY RAND() LIMIT 1

هم اینو امتحان کردم

$get=mysql_query("SELECT user_id, name FROM users


WHERE `user_id` IN (SELECT image_id, album_id, timestamp, ext, image_title FROM `images` ORDER BY `image_id` DESC LIMIT 20) ORDER BY RAND() LIMIT 1


");

هم اینجوری


$get=mysql_query("SELECT images.image_id, images.album_id, images.timestamp, images.ext, images.image_title ,
users.user_id, users.name
FROM images, users
WHERE `images.image_id` IN (SELECT `images.image_id` FROM `images` ORDER BY `images.image_id` DESC LIMIT 20) ORDER BY RAND() LIMIT 1


");

هر دوتاش ارور میده

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\wamp\www\css\upload\index.php on line 24

یعنی تو این فروم کسی نمیتونه جواب بده یا حالو حوصله جواب دادن نداره :عصبانی:

MMSHFE
سه شنبه 29 فروردین 1391, 00:12 صبح
خوب دوست عزیز کوئری رو درست بنویسید تا خطا نگیرین. این خطا هم داره میگه کوئری شما اشکال داشته و اجرا نشده. با mysql_error یکبار خطا رو چاپ کنید و اگه از اون خطا متوجه نشدین مشکل کجاست، بعد سؤال بپرسید. درهرحال، پیشنهاد میکنم استانداردنویسی رو رعایت کنید:


$get=mysql_query("SELECT `user_id`, `name` FROM `users`
WHERE (`user_id` IN
(SELECT `image_id`, `album_id`, `timestamp`, `ext`, `image_title`
FROM `images` ORDER BY `image_id` DESC LIMIT 20
)
)
ORDER BY RAND()
LIMIT 1");

و دستور بعدی:


$get=mysql_query("SELECT `images`.`image_id`, `images`.`album_id`, `images`.`timestamp`, `images`.`ext`, `images`.`image_title`, `users`.`user_id`, `users`.`name`
FROM `images`, `users`
WHERE `images`.`image_id` IN
(SELECT `images`.`image_id` FROM `images` ORDER BY `images`.`image_id` DESC LIMIT 20)
ORDER BY RAND()
LIMIT 1");

mosi2007
سه شنبه 29 فروردین 1391, 01:33 صبح
بازم با کدهایی که شما دادین امتحان کردم نشد
با mysql_error نوع خطا مشخص شد
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

دارم زمپو با نسخه mysql 5.5.8 دانلود میکنم خدا کنه که زمپ جدید این دستورات رو ساپورت کنه

دستت درد نکنه
لطفا به این تاپیک هم جواب بده سوال اخری رو بی زحمت بخون خودم با کمک شما تا یه جاییش حل کردم ولی

MMSHFE
سه شنبه 29 فروردین 1391, 07:39 صبح
خوب خطای مربوطه داره میگه این نسخه از MySQL شما از LIMIT توی Subqueryها پشتیبانی نمیکنه. از روی سایتم Wamp Server 2.2d رو دانلود کنید. نسخه 5.5.20 نرم افزار MySQL همراهشه. موفق باشید.

mosi2007
سه شنبه 29 فروردین 1391, 14:07 عصر
خوب خطای مربوطه داره میگه این نسخه از MySQL شما از LIMIT توی Subqueryها پشتیبانی نمیکنه. از روی سایتم Wamp Server 2.2d رو دانلود کنید. نسخه 5.5.20 نرم افزار MySQL همراهشه. موفق باشید.
این ومپی که شما معرفی کردین هم از تو سایتتون دانلود کردم و نصب هم کردم ولی بازم همین ارور رو میده قبل از این هم زمپو نصب کردم با نسخه 5.5.3 اونم همین ارور رو داد ترخدا کمک کنید
ومپ شما این دسستورو ساپورت میکنه یا نه اگه میشه یه دفعه امتحان کنید
در ضمن من ویندوزم 64 بیتیه و ومپی که شما معرفی کردین من 32 بیتی را دانلود کردم درست نصب شد
فکر نکنم ایراد ماله این باشه محض اطلاع گفتم
بی زحمت ابه این تاپک هم جواب بدین فقط سوال اخری رو بخونین و جواب بدین
http://barnamenevis.org/showthread.php?336833-%D8%AE%D9%84%D8%A7%D8%B5%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-url/page2

MMSHFE
سه شنبه 29 فروردین 1391, 15:02 عصر
اگه ميشه يك Export از ديتابيس بگذارين تا روش كار كنم و كوئري معادلي كه از Limit توي SubQuery استفاده نميكنه براتون بنويسم كه روي ديتاي خودتون كار كنه.