PDA

View Full Version : حرفه ای: مشکل در نوشتن یک کوئری پیچیده



maysam.m
شنبه 06 آبان 1391, 17:27 عصر
سلام

من سه تا جدول با ساختار فرضی زیر دارم.

website = id, url, category_id

category = id, name

news = id, website_id

میخوام جدول website رو با جدول category بر اساس ستون مشترک category_id ادغام کنم که تا اینجا مشکلی نیست.

خروجی میشه: لیست سایت ها با نام دسته ی هر سایت به اضافه نمایش تعداد خبرهای هر سایت
در واقع نام هر دسته و تعداد خبرهای هر سایت به جدول "website" اضافه بشه.


SELECT *
FROM website w
LEFT JOIN `categoey` ON (w.category_id = category.id)
ORDER BY w.id DESC


مشکل از اینجا بوجود میاد که میخوام تعداد count(*) هر رکورد موجود در جدول website رو بر اساس تعداد رکوردهای موجود در جدول news بدست بیارم . یعنی اینجوری
SELECT COUNT(*) FROM news WHERE w.id = news.website_id

و همه ی اینها رو با ساب کوئری بهم چسبوندم که کار نکرد:

SELECT w.*,(
SELECT COUNT(*)
FROM news
WHERE w.id = news.website_id) AS `num`
FROM website w
LEFT JOIN `categoey` ON (w.category_id = category.id)
-- LEFT JOIN `news` ON (w.id = news.website_id)
ORDER BY w.id DESC
-- GROUP BY w.id


خروجی تقریبا این باید بشه:


table website:
id url category_id
1 php-jquery.ir 1
2 google.com 2
3 www.php-jquery.ir 1


table category:
id name
1 php
2 search

table news:
id text website_id
1 php...! 1
2 jQuery!... 1
3 mySql 1


output:
website_id website_url website_category website_count_news
1 php-jquery.ir php 3
2 google.com search 0
3 www.php-jquery.ir php 0


ممنون میشم کمک کنید.

Unique
دوشنبه 08 آبان 1391, 01:42 صبح
اولا جای این سوال اینجا نیست !
ثانیا از من به شما نصیحت که برای هر فیلد از جدولت یک prefix بگذار تا خودت را درگیر اسامی شبیه به هم نکنی !
ثالثا query را خیلی بد نویشتی ! البته درست به نظر میادش ها ! اما این باید جوای بده :


select w.id,w.url,c.name,(select count(*) from news as n where n.website_id = w.id) as total
from website as w
left join category as c on c.id = w.category_id
order by w.id desc

maysam.m
چهارشنبه 10 آبان 1391, 13:47 عصر
اولا جای این سوال اینجا نیست !
ثانیا از من به شما نصیحت که برای هر فیلد از جدولت یک prefix بگذار تا خودت را درگیر اسامی شبیه به هم نکنی !
ثالثا query را خیلی بد نویشتی ! البته درست به نظر میادش ها ! اما این باید جوای بده :


select w.id,w.url,c.name,(select count(*) from news as n where n.website_id = w.id) as total
from website as w
left join category as c on c.id = w.category_id
order by w.id desc

اینجا مربوط به پی اچ پیه و بلاخره کسایی که با اون سرو کار دارند از مای اس کیو ال هم سر رشته دارند.
و در مورد پیشوند بگم که من همه ی جدولهام پیشوند دارند اینجا برای اینکه زیاد پیچیده نشه و ساده باشه اونها رو حذف کردم
و در اخر باید بگم در اینجا (http://www.php-jquery.ir/3240/مشکل-در-نوشتن-یک-کوئری-پیچیده) به جواب رسیدم!