PDA

View Full Version : نحوه ی نوشتن کوئری برای جمع یک ستون



alireza_s_84
سه شنبه 22 مرداد 1392, 23:38 عصر
سلام دوستان
توی عکسی که گذاشتم 4 تا جدول دارم که ارتباطشون رو میبنید
میخوام امتیازات یک کاربر رو حساب کنم که در فیلد Score در جدول Scores ذخیره میشه البته در جدول ScoreMode مقدار اصلی ذخیره شده که ممکنه -1 ، 1 و یا 0 باشه و در جدول Scores یک ارتباط از طریق Id شکل گرفته
من در نوشتن این کوئری مشکل دارم ممنون میشم متخصصین راهنمایی بفرمایند

http://upload7.ir/images/46668991336168554513.png

محمد سلیم آبادی
چهارشنبه 23 مرداد 1392, 12:08 عصر
SELECT t.*, d.total
FROM tbl_users t
INNER JOIN
(
SELECT UserID, SUM(b.value) as total
FROM tbl_Scores a
INNER JOIN tbl_ScoreMode b
ON a.ScoreMode = b.ModeId
GROUP BY UserID
)d
ON t.userID = d.UserID;

alireza_s_84
چهارشنبه 23 مرداد 1392, 14:11 عصر
SELECT t.*, d.total
FROM tbl_users t
INNER JOIN
(
SELECT UserID, SUM(b.value) as total
FROM tbl_Scores a
INNER JOIN tbl_ScoreMode b
ON a.ScoreMode = b.ModeId
GROUP BY UserID
)d
ON t.userID = d.UserID;


سپاس بی کران کاملا صحیح بود فقط INNER JOIN میبایست به LEFT JOIN تبدیل می شد

محمد سلیم آبادی
چهارشنبه 23 مرداد 1392, 16:00 عصر
بله اگر برای کاربر مورد نظر هیچ امتیازی ثبت نشده باشه باید از Left join استفاده کنید.

alireza_s_84
پنج شنبه 24 مرداد 1392, 00:18 صبح
بله اگر برای کاربر مورد نظر هیچ امتیازی ثبت نشده باشه باید از Left join استفاده کنید.

حالا اگه بخوام تعداد پست ها رو شمارش کنم چطور میشه؟؟؟

alireza_s_84
پنج شنبه 24 مرداد 1392, 10:08 صبح
بله اگر برای کاربر مورد نظر هیچ امتیازی ثبت نشده باشه باید از Left join استفاده کنید.

من اینو نوشتم اگه ایرادی داره بهم بگین ممنون میشم


SELECT ISNULL(d.TotalScores,0) AS TotalScores, ISNULL(f.TotalPosts,0) AS TotalPost, t.Username,t.CreationDate, t.FirstName, t.LastName, tbl_Country.CountryName, tbl_City.CityName
FROM (SELECT SenderId, COUNT(*) AS TotalPosts
FROM tbl_Posts
GROUP BY SenderId) AS f
RIGHT OUTER JOIN
tbl_Users AS t
INNER JOIN
tbl_Province INNER JOIN
tbl_Country ON tbl_Province.CountryId = tbl_Country.CountryId INNER JOIN
tbl_City ON tbl_Province.ProvinceId = tbl_City.ProvinceId ON t.City = tbl_City.CityId LEFT OUTER JOIN
(SELECT a.UserId, SUM(b.Value) AS TotalScores
FROM tbl_Scores AS a INNER JOIN
tbl_ScoreMode AS b ON a.ScoreMode = b.ModeId
GROUP BY a.UserId) AS d ON t.UserId = d.UserId ON f.SenderId = t.UserId
WHERE (t.Username = 'alireza_s_84')
ORDER BY
TotalScores,TotalPosts,CreationDate

محمد سلیم آبادی
پنج شنبه 24 مرداد 1392, 13:04 عصر
خوب بنظر میرسه.
اما بهتره به یک نکته توجه بشه. اون هم نوشتن شرط join در جای مناسبش هست. شما برخی از شرطها را (که بعد از ON آمده اند) در جاهای مختلف قرار دادین. که این باعث میشه خوانایی کدتان کاهش پیدا کنه.
من به شخصه تا حالا ندیدم که کسی به این شکل شرطهای join را بنویسه و بنظر میرسه که استاندارد هم نباشه.
اگر مزیت خاصی داره این روش شما برام جالبه بدونم.

این همان query شماست اما باکمی جابجایی برای افزایش خوانایی:

SELECT ISNULL(d.TotalScores,0) AS TotalScores,
ISNULL(f.TotalPosts,0) AS TotalPost,
t.Username,t.CreationDate, t.FirstName, t.LastName,
tbl_Country.CountryName,
tbl_City.CityName
FROM tbl_users t
INNER JOIN tbl_City
ON t.City = tbl_City.CityId
INNER JOIN tbl_Province
ON tbl_Province.ProvinceId = tbl_City.ProvinceId
INNER JOIN tbl_Country
ON tbl_Province.CountryId = tbl_Country.CountryId
LEFT OUTER JOIN
(
SELECT a.UserId, SUM(b.Value) AS TotalScores
FROM tbl_Scores AS a INNER JOIN
tbl_ScoreMode AS b ON a.ScoreMode = b.ModeId
GROUP BY a.UserId
) AS d
ON t.UserId = d.UserId
LEFT OUTER JOIN
(
SELECT SenderId, COUNT(*) AS TotalPosts
FROM tbl_Posts
GROUP BY SenderId
) AS f
ON f.SenderId = t.UserId
WHERE (t.Username = 'alireza_s_84')
ORDER BY TotalScores,TotalPosts,CreationDate;

alireza_s_84
پنج شنبه 24 مرداد 1392, 16:42 عصر
خوب بنظر میرسه.
اما بهتره به یک نکته توجه بشه. اون هم نوشتن شرط join در جای مناسبش هست. شما برخی از شرطها را (که بعد از ON آمده اند) در جاهای مختلف قرار دادین. که این باعث میشه خوانایی کدتان کاهش پیدا کنه.
من به شخصه تا حالا ندیدم که کسی به این شکل شرطهای join را بنویسه و بنظر میرسه که استاندارد هم نباشه.
اگر مزیت خاصی داره این روش شما برام جالبه بدونم.

این همان query شماست اما باکمی جابجایی برای افزایش خوانایی:

SELECT ISNULL(d.TotalScores,0) AS TotalScores,
ISNULL(f.TotalPosts,0) AS TotalPost,
t.Username,t.CreationDate, t.FirstName, t.LastName,
tbl_Country.CountryName,
tbl_City.CityName
FROM tbl_users t
INNER JOIN tbl_City
ON t.City = tbl_City.CityId
INNER JOIN tbl_Province
ON tbl_Province.ProvinceId = tbl_City.ProvinceId
INNER JOIN tbl_Country
ON tbl_Province.CountryId = tbl_Country.CountryId
LEFT OUTER JOIN
(
SELECT a.UserId, SUM(b.Value) AS TotalScores
FROM tbl_Scores AS a INNER JOIN
tbl_ScoreMode AS b ON a.ScoreMode = b.ModeId
GROUP BY a.UserId
) AS d
ON t.UserId = d.UserId
LEFT OUTER JOIN
(
SELECT SenderId, COUNT(*) AS TotalPosts
FROM tbl_Posts
GROUP BY SenderId
) AS f
ON f.SenderId = t.UserId
WHERE (t.Username = 'alireza_s_84')
ORDER BY TotalScores,TotalPosts,CreationDate;


مطمئنا چیزی که شما نوشتین خیلی بهتره ، من از Query Design ویژوال استدیو استفاده میکنم و اون بعد از نوشتن کدها اینطوری تغییر داد

محمد سلیم آبادی
پنج شنبه 24 مرداد 1392, 17:16 عصر
عجب. پس این کد رو visual studio تولید کرده.
تعجب کردم وقتی دیدم کدتون رو با خودم گفتم چطور تونسته query رو به این شکل بنویسه و گیج نشه. چرا که query از ترکیب left outer join و right outer join و Inner join تشکیل شده. و شرط های join هم هر کدام در یک قسمتی قرار گرفتن...