PDA

View Full Version : سوال: دو سلکت در یک کوئری - مرتب سازی



tehro0n
جمعه 03 شهریور 1391, 20:58 عصر
سلام، کدی هست که تعداد بازدید صفحات رو برای امروز نمایش می ده، حالا اگه بخوام تعداد بازدید های دیروز رو هم با همین کوئری استفاده کنم چطور باید بنویسم

SELECT
COUNT(`id`) as `outerUri`, `title`
FROM
`hits`
WHERE
`time` > {$today}
GROUP BY
`uri`
ORDER BY
`outerUri` DESC
LIMIT 0,20

کدی که برای دیروز رو نمایش می ده هم به این صورته که این دو تا رو نمی دونم چطور ترکیب کنم


SELECT
COUNT(`id`) as `YUri`, `title`
FROM
`hits`
WHERE
`time` BETWEEN {$today} - 86400 AND {$today}
GROUP BY
`uri`
ORDER BY
`YUri` DESC
LIMIT 0,20

فقط چیزی که باید دقت داشته باشیم اینه که ممکنه صفحاتی که امروز مشاهده میشه رو دیروز ندیده باشند و باید بر اساس `uri` ها این چیدمان باشه نه مرتب سازی بر اساس تعداد روزهای زیاد به کم صفحات دیروز

یعنی فلان صفحه که مرتب شده بر اساس امروز ، حالا همان صفحه ها رو تعداد مشاهده در دیروز نمایش بده

pejman_view
جمعه 03 شهریور 1391, 23:50 عصر
سلام

کافی است کوئری خود را بگونه ایی تغییر دهید که بازدیدهای دیروز و امروز را نمایش بدهد:

SELECT
COUNT(`id`) as `YUri`, `title`
FROM
`hits`
WHERE
`time` > $today - 86400
GROUP BY
`uri`
ORDER BY
`YUri` DESC
LIMIT 0,20

حالا خروجی بصورت کوچکتر به بزرگتر نمایش داده می شود و می توانید در PHP در حلقه خود کمی تغییرات ایجاد کنید مانند مثال زیر:

while ($row = mysqli_fetch_assoc($r)){
if ($row['time'] <$today){
echo 'YesterDay';
}else{
echo 'Today';
}
}

موفق باشید

tehro0n
شنبه 04 شهریور 1391, 04:19 صبح
این کار صفحاتی که دیروز تا به حال نمایش داده شده رو در مجموع محاسبه می کنه، ممکنه صفحه ای که دیروز کلی بازدید داشته امروز بازدید نداشته باشه و اینجوری توی لیست در بالا قرار می گیره

من می خواهم که بازدیدهای صفحاتی که امروز دیده شده رو نمایش بده، و حالا همان صفحات رو دقیقا برای دیروز کنارش نمایش بده

pejman_view
شنبه 04 شهریور 1391, 10:17 صبح
سلام
کمی توضیحات شما مرا گیج کرد اما در کل متوجه شدم می خواهید آمار بازدید یک صفحه را در دو روز متوالی کنار هم قرار داده تا بتوانید راحت مقایسه کنید.
دو روش که به ذهن من می رسه:
1- استفاده از کوئری مناسب مانند زیر:


SELECT
COUNT(`id`) as `YUri`, `title`
FROM
`hits`
WHERE
`time` > $today - 86400
GROUP BY
`uri`
ORDER BY
MAX(`time`) DESC
LIMIT 0,20

روش دوم: استفاده از sorting آرایه
کوئری خود را طوری بنویسید که بر اساس زمان از بزرگ به کوچک جستجو کند حالا آرایه $row را داخل یک متغیر بریزید و آن را sort کنید. در مثال زیر با توضیحات این کار را انجام دادم:

//while ro eslah konid manande zir
// zemnan select khod ra bar asase zaman az bozorg be koochak anjam dahid
$stat = array();
while ($row = mysqli_fetch_assoc($r)){
$stat[] = $row;
}

//namayeshe array ghabl az sorting va be soorate kham ke az database biroon amade
print_r($stat);
echo "\n";
// namayeshe array bad az sorting
uasort($stat, 'sortingCostumized');
print_r($stat);

// tabeye delbekhah ke kare sorting ro baraye ma anjam midahad
function sortingCostumized($a, $b) {
return strcmp($a['link'],$b['link']);
}

خروجی قبل از sort شدن آرایه:


Array ( [0] => Array ( [link] => google.html [visited] => 4 [time] => 1345874568 ) [1] => Array ( [link] => test.html [visited] => 4 [time] => 1345874568 ) [2] => Array ( [link] => google.html [visited] => 8 [time] => 1345788168 ) [3] => Array ( [link] => test.html [visited] => 12 [time] => 1345788168 ) )


و بعد از sort:
Array ( [2] => Array ( [link] => google.html [visited] => 8 [time] => 1345788168 ) [0] => Array ( [link] => google.html [visited] => 4 [time] => 1345874568 ) [3] => Array ( [link] => test.html [visited] => 12 [time] => 1345788168 ) [1] => Array ( [link] => test.html [visited] => 4 [time] => 1345874568 ) )

موفق و پیروز باشید.

tehro0n
شنبه 04 شهریور 1391, 14:10 عصر
این روش اولی که منطقی تره چون
`time` > $today - 86400 پس group by که بر اساس تعداد count های نام صفحات است برای تاریخ دیروز تا به حال است،
با یک مثال عددی توضیح میدم:

صفحه 1 در دیروز22 بازدید و در امروز5 بازدید باشه، و از طرف دیگه صفحه 2 در دیروز 3 و امروز 26 بازدید باشه، و صفحه 3 در دیروز 30 و امروز هیچ بازدید نداشته باشه
حالا اگه این کد رو بگذاریم میاد میگه ردیف اول صفحه 3 ردیف دوم صفحه 2 و ردیف سوم صفحه 1 است، چون مجموع صفحات به ترتیب از زیاد به کم این میشه، و در نهایت که بیام امروز و دیروز رو هم جدا کنم باز ترتیب ردیف ها تغییر نمی کنه
ولی چیزی که من می خوام اینه
ردیف اول صفحه 2 با 26 بازدید و کنارش هم دیروز رو 3 بازدید نمایش بدم، ردیف دوم صفحه 1 با 5 بازدید و کنارش هم دیروز رو 22 بازدید نمایش بده، و در آخرین ردیف هم صفحه 3 با 0 بازدید و دیروز رو هم 30 بازدید نمایش بده

البته تنها چیزی که اینجا به ذهنم میرسه اینه که همین کد اول رو بنویسم و دیروز و امروز رو جدا کنم، و با php دوباره بیام بر اساس امروز سورت کنم و دیروز رو هم که همه تو آرایه هستند نمایش بدم
ولی این کار یکم CPU می گیره، و می خوام اگه میشه تو همون SQL تمام این محاسبات رو انجام بده و خروجی که می خوام رو نمایش بده

pejman_view
شنبه 04 شهریور 1391, 17:12 عصر
سلام

کوئری اصلاح شد.

با آرزوی موفقیت.

tehro0n
شنبه 04 شهریور 1391, 20:18 عصر
سلام

کوئری اصلاح شد.

با آرزوی موفقیت.

این آن چیزی نیست من می خوام! چون اگه بخوام این کد رو استفاده کنم، اولا بر اساس URI مرتب نمیشه، ثانیا اگه اولین از این 20 تا بیام برای امروز و دیروز شرط بگذارم 20 ردیف نخواهم داشت
چیزی که من می خوام شبیه بازديد صفحات و ورودی (http://www.webgozar.com/counter/stats.aspx?code=2164569#) در صفحه وبگذر است.. دیگه نمی دونم چطور توضیح بدم :لبخند:

pejman_view
شنبه 04 شهریور 1391, 22:34 عصر
سلام

من اسکرین شات گرفتم گذاشتم : اگر من بد برداشت کردم بگو :گریه:
http://up.vatandownload.com/images/clsr5o3r6260hi9y6d.png

البته فکر می کنم ساختار دیتابیس شما با آنچیزی که در ذهن من است تفاوت دارد.

tehro0n
یک شنبه 05 شهریور 1391, 04:01 صبح
سلام

من اسکرین شات گرفتم گذاشتم : اگر من بد برداشت کردم بگو :گریه:
http://up.vatandownload.com/images/clsr5o3r6260hi9y6d.png

البته فکر می کنم ساختار دیتابیس شما با آنچیزی که در ذهن من است تفاوت دارد.

فکر کنم اشتباه متوجه شدید
ساختار من یکی این که زمان بر اساس mktime نیست و با هربار افزودن همان موقع زمان ثبت میشه
دوم اینکه چیزی به نام ویزیت در این table نیست و URI صفحات هر دفعه اضافه میشه و برای همین count uri گذاشتم و در نهایت group by تعیین کردم

pejman_view
یک شنبه 05 شهریور 1391, 10:47 صبح
فکر کنم اشتباه متوجه شدید
ساختار من یکی این که زمان بر اساس mktime نیست و با هربار افزودن همان موقع زمان ثبت میشه
دوم اینکه چیزی به نام ویزیت در این table نیست و URI صفحات هر دفعه اضافه میشه و برای همین count uri گذاشتم و در نهایت group by تعیین کردم
سلام

انگار من این همه راه حل دادم سر حدس اشتباه بوده و باید بگم متاسفانه راهی به ذهن من نمی رسه که فقط همان دو سلکت را انجام بدهید.
اما حتماً دو تا کوئری را در دو آرایه مختلف بریزید و با یک حلقه اجرا کنید سرعت کارتان بالا می رود

با آرزوی موقیت

tehro0n
چهارشنبه 08 شهریور 1391, 12:38 عصر
سلام،
یک نمونه دیگه از سلکت گیری هم برام پیش آمده اگه میشه راهنمایی کنید..
من می خوام با یک کوئری یک سری اطلاعاتی که group by شده رو سورت کنم، این اطلاعات مثلا شامل id, page, subpage هست
حالا نمایش آن ها به شکلی باشه که بر اساس page ها group by و count بشه ( یعنی تعداد insert های page رو که یکسان هستند بشماره و به ترتیبشون کنه ) حالا در ادامه این page ها خودشون یکسری زیر مجموعه دارند که آن ها را در کنار خودش نمایش بده
مثال
بازديد صفحات و ورودی (http://www.webgozar.com/counter/stats.aspx?code=2164569#) قسمت سايتهای لينک‌دهنده در وبگذر نمونه ای از کار منه که ابتدا صفحات دومین اصلی به ترتیب میشن و در کنار آنها مثلا 5 تای آخر صفحات زیرمجموعه دومین اصلی نمایش داده میشه
اگه این خروجی با یک کودری انجام بشه به این صورت نمایش داده میشه


id page1 page1-1
id page1 page1-2
id page1 page1-3
id page2 page2-1
id page2 page2-2

چیزی که فقط من به ذهنم میرسه اینه که اول page های اصلی رو group by و بر اساس تعدادشون سورت کنم
و در حلقه هر دفعه یک کوئری بگیرم که با توجه به page بیاد subpage هارو هم پیدا کنه
که این جوری برای 15 نمایش سایت 16 کوئری در مجموع گرفته میشه که این اصلا خوب نیست

tehro0n
جمعه 10 شهریور 1391, 03:40 صبح
:متفکر::متفکر:

pejman_view
شنبه 11 شهریور 1391, 15:11 عصر
سلام،
یک نمونه دیگه از سلکت گیری هم برام پیش آمده اگه میشه راهنمایی کنید..
من می خوام با یک کوئری یک سری اطلاعاتی که group by شده رو سورت کنم، این اطلاعات مثلا شامل id, page, subpage هست
حالا نمایش آن ها به شکلی باشه که بر اساس page ها group by و count بشه ( یعنی تعداد insert های page رو که یکسان هستند بشماره و به ترتیبشون کنه ) حالا در ادامه این page ها خودشون یکسری زیر مجموعه دارند که آن ها را در کنار خودش نمایش بده
مثال
بازديد صفحات و ورودی (http://www.webgozar.com/counter/stats.aspx?code=2164569#) قسمت سايتهای لينک‌دهنده در وبگذر نمونه ای از کار منه که ابتدا صفحات دومین اصلی به ترتیب میشن و در کنار آنها مثلا 5 تای آخر صفحات زیرمجموعه دومین اصلی نمایش داده میشه
اگه این خروجی با یک کودری انجام بشه به این صورت نمایش داده میشه


id page1 page1-1
id page1 page1-2
id page1 page1-3
id page2 page2-1
id page2 page2-2

چیزی که فقط من به ذهنم میرسه اینه که اول page های اصلی رو group by و بر اساس تعدادشون سورت کنم
و در حلقه هر دفعه یک کوئری بگیرم که با توجه به page بیاد subpage هارو هم پیدا کنه
که این جوری برای 15 نمایش سایت 16 کوئری در مجموع گرفته میشه که این اصلا خوب نیست
سلام

خوب برای اینکه 16 کوئری ایجاد نکنید بهتر است یک کوئری بنویسید و خروجی را با پی اچ پی پردازش کنید. اینطوری سریعتر است و فشار کمتری بر روی دیتابیس خود می آورید.

با آرزوی موفقیت