PDA

View Full Version : خروجی اشتباه در اماره بازدید هر پست



Veteran
جمعه 24 آبان 1392, 18:49 عصر
سلام دوستان
یک مشکلی که دارم و هرچقدر میگردم نمیتونم مشکل رو حل کنم
اینکه اماره بازدید هر پست در کوئری زیر اشتباه هست !
من یک جدول visits دارم که IP و ایدی پست رو داره
حالا توی کوئری اومدم پست هارو جوین کردم به جدول visits که تعداد بازدید هرپست رو در بیارم
اما خروجی اشتباه هست ! مثلا من 5 تا رکورد با پست ایدی 3 دارم اما خروجی ی چیزه دیگه اس
ممنون میشم کوئری رو برررسی کنید
دیتابیس هم پیوست شد

Select
content_list.id,
content_list.title,
content_list.des,
content_list.date,
content_list.tags,
content_list.parent,
content_list.parent as `visits`,
content_list.parent as `catid`,
content_list.parent as `cComments`,
content_list.parent as `images`

From
content_list
Where
content_list.parent = 0
Union
Select
content_list.id,
content_list.title,
content_list.des,
content_list.date,
content_list.tags,
category_list.title As `title1`,
count(vt.pid) As `visits`,
category_list.id As `catid`,
count(distinct comments.id) As `cComments`,
group_concat( distinct image) as `images`
From
content_list
left join
visits as vt
on content_list.id=vt.pid
inner join
category_list On content_list.parent =
category_list.id
left join
comments on comments.status='0' and comments.pid=content_list.id

left join
content_image as ci
on
ci.content_id=content_list.id
left join
images
on images.id=ci.image_id
Group By
content_list.id

Order By

date Desc

ابوذر محمودی
جمعه 24 آبان 1392, 20:38 عصر
الان خروجی چی برمیگردونه؟

Veteran
جمعه 24 آبان 1392, 20:42 عصر
تعداد بازدید برای پست با ایدی 3
10 تا برمیگردونه/درصورتی که من توی جدول visits فقط 5 تا رکورد با پست ایدی 3 دارم

MMSHFE
جمعه 24 آبان 1392, 21:26 عصر
خوب چرا Join ؟ این کوئری جواب نمیده؟
SELECT COUNT(*) AS `total` FROM `visits` WHERE (`pid`='3')

Veteran
جمعه 24 آبان 1392, 21:32 عصر
خب این کوئری که نوشتم میاد تمام پست ها با اطلاعاتشون :
اسم عکس ها
تعداد نظرات
مطلب و عنوان مطلب
و ...
در قالب یک رکورد به خروجی میبره،10مثلا تا پست 10 تا رکورد

یکی دیگه از اطلاعاتی که میخوام اینکه هر پست چه تعداد باز دید داشته
===
الان با این کد شما خب من باید بیام روی تمام مطالب یک حلقه بزنم و pid رو تغییر بدم دیگه درسته ؟ که فکر نکنم مناسب باشه :متفکر:
این کد زمانی مناسب هست که فقیط من بخوام تعداد بازدید رو به دست میارم/اما من اطلاعات دیگه ایی که در دیگر جدول ها هم هست رو نیاز دارم

ابوذر محمودی
جمعه 24 آبان 1392, 21:52 عصر
من بعد یک ساعت و نیم حرکت لاک پشتی به این نتیجه رسیدم که این کد داده های تکراری واکشی میکنه :
left join
content_image as ci
on
ci.content_id=content_list.id
http://www.uploadax.com/images/95192142921718243573.png
مغز من که هنگ کردم ، این همه join !!!؛ بیچاره سرور دمار از روزگارش در میاد .
من برای جاهایی که نال میده شرط گذاشتم کوئری درست جواب داد.


Select
content_list.id,
content_list.title,
content_list.des,
content_list.date,
content_list.tags,
category_list.title As `title1`,
count(vt.pid) As `visits`,
category_list.id As `catid`,
count(distinct comments.id) As `cComments`,
group_concat( distinct image) as `images`
From
content_list
left join
visits as vt
on content_list.id=vt.pid
inner join
category_list On content_list.parent =
category_list.id
left join
comments on comments.status='0' and comments.pid=content_list.id

left join
content_image as ci
on
ci.content_id=content_list.id
left join
images
on images.id=ci.image_id where images.id <> NULL
Group By
content_list.id

Order By

date Desc

باید ببینی چرا کد تکراری میده ، شرطشو درست کن

MMSHFE
جمعه 24 آبان 1392, 22:10 عصر
خب این کوئری که نوشتم میاد تمام پست ها با اطلاعاتشون :
اسم عکس ها
تعداد نظرات
مطلب و عنوان مطلب
و ...
در قالب یک رکورد به خروجی میبره،10مثلا تا پست 10 تا رکورد

یکی دیگه از اطلاعاتی که میخوام اینکه هر پست چه تعداد باز دید داشته
===
الان با این کد شما خب من باید بیام روی تمام مطالب یک حلقه بزنم و pid رو تغییر بدم دیگه درسته ؟ که فکر نکنم مناسب باشه :متفکر:
این کد زمانی مناسب هست که فقیط من بخوام تعداد بازدید رو به دست میارم/اما من اطلاعات دیگه ایی که در دیگر جدول ها هم هست رو نیاز دارم
درسته برای همه رکوردها، نوشتن کوئریهای جداگانه بهینه نیست ولی باید دقت کنید که استفاده مناسب از Join مستلزم طراحی خوب Schema و Relationهای مربوطه هست و اینکه از چه Join خاصی استفاده کنیم هم بستگی به طراحی دیتابیس و نیاز ما داره. مثلاً ممکنه یکجا LEFT OUTER JOIN مناسب باشه و جای دیگه NATURAL JOIN یا مثلاً INNER JOIN و...
ضمناً درمورد کوئری جداگانه هم همیشه نمیشه با اطمینان گفت که بهینه نیست. مثلاً اگه جداول به خوبی پیوند نداشته باشن یا از MyISAM استفاده کنید و Relationها و Foreign Keyها به درستی تنظیم نشده باشه (حتی در نوع ارتباط مثل RESTRICT یا CASCADE و...) اونوقت JOIN خودش سربار وحشتناکی ایجاد خواهد کرد. کوئری جداگانه حداقل مزیتش اینه که سرباری که میگذاره در اکثر مواقع فقط روی کد هست (کد بیشتری باید بنویسید) که اون رو هم میشه با استفاده صحیح از حلقه ها و توابع کاهش داد.

ابوذر محمودی
جمعه 24 آبان 1392, 22:20 عصر
خب این کوئری که نوشتم میاد تمام پست ها با اطلاعاتشون :
اسم عکس ها
تعداد نظرات
مطلب و عنوان مطلب
و ...
در قالب یک رکورد به خروجی میبره،10مثلا تا پست 10 تا رکورد

یکی دیگه از اطلاعاتی که میخوام اینکه هر پست چه تعداد باز دید داشته
===
الان با این کد شما خب من باید بیام روی تمام مطالب یک حلقه بزنم و pid رو تغییر بدم دیگه درسته ؟ که فکر نکنم مناسب باشه :متفکر:
این کد زمانی مناسب هست که فقیط من بخوام تعداد بازدید رو به دست میارم/اما من اطلاعات دیگه ایی که در دیگر جدول ها هم هست رو نیاز دارم
نیازی نیست که با حلقه pid رو تغییر بدین با یک کوئری ساده میشه اینکارو کرد:

SELECT id , COUNT(*) TotalCount
FROM content_list,visits
where content_list.id=visits.pid
GROUP BY id
ORDER BY TotalCount DESC

Veteran
جمعه 24 آبان 1392, 22:26 عصر
وقتی گفتین داره داده تکراری برمیگردونه
رفتم کد رو به inner join تغییر دادم و درست شد

inner join
images
on images.id=ci.image_id
تشکر از دوست عزیزم جناب محمودی و استاد بزرگوار جناب شهرکی که هر پستشون خودش یک دوره اموزشیه :قلب: