PDA

View Full Version : کمک برای نوشتن یک کوئری برای select از یک جدول



PrinceDotNet
پنج شنبه 05 شهریور 1388, 00:40 صبح
سلام

من یک جدول دارم که مطالب ویکی مو توش نگهداری می کنم! برای هز تغییر در متن ویکی من یک رکورد جدید از متن رو دوباره وارد جدول می کنم و برای جدا کردن اون از متن قبلی یک ستون به نام version دارم که به مقدار آخر یکی اضافه می کنه و وارد می شه!
حالا من می خوام به 10 صفحه ی آخری که ویرایش شده دسترسی داشته باشم! یعنی 10 صفحه ی متمایز از جدید ترین رکوردهای وارد شده به جدول که version اونا بین wikiid برابر مقداز max رو داشته باشه!
برای بدست آوردنش از چه رکوردی باید استفاده کنم؟

ممنون

علیرضا مداح
پنج شنبه 05 شهریور 1388, 09:56 صبح
سلام دوست عزیز،
لطفا" ساختار جداول خود را در اینجا قرار دهید،
برای این منظور از جداول مورد نظر اسکریپت CREATE TABLE تهیه کرده و پست کنید،/

svahidm
پنج شنبه 05 شهریور 1388, 10:16 صبح
سلام
اگه درست فهمیده باشم شما باید بتونین روی wikid دستور group by رو بزنین و بگین تو هرگروه max version رو بده(قطعا wikiid کلید اصلی نیست دیگه؟؟!!)

select top 10 max(version),wikiid from <table> group by wikiid


برای اینکه 10 صفحه جدیدترین ها باشه باید یه فیلدی مثل تاریخ ویرایش هم داشته باشی که بتونی مرتب سازی هم انجام بدی یعنی:
<select top 10 max(version),wikiid from <table> group by wikiid order by <date desc

خوب تو این دستور فقط میتونین آخرین version و wikiid رو بگیرین که اگه فیلد های بیشتری بخواین حالا باید از جدول اصلی اونایی رو بیارین که wikiid , version شون از دستور بالا بدست اومده که میتونی نتیجه ی دستور بالا رو تو یه جدول موقت بزاری و ازش استفاده کنی

اگه تست کردی نتیجه رو بهم بگو لطفا

PrinceDotNet
پنج شنبه 05 شهریور 1388, 11:30 صبح
ممنون دوست من کاملا درست بود. ولی الان یک مشکلی دارم! همونطور که خودتونم اشاره کردید wikiid کلید اصلی نیست ولی یک ستون به نام ID دارم که کلید اصلی هستش و باید اون هم select بشه! اما موقعی که توی select نام این ستون دو هم وارد می کنم خطای زیر رو میده :



column ID is invalid in the select list because it's not contained in either an aggregate function or the GROUP BY clause.

svahidm
پنج شنبه 05 شهریور 1388, 17:32 عصر
این خطا به خاطر اینه که شما تو دستور select با group by نمی تونی غیر از توابع sum,avg,..و فیلد مورد نظر در که اینجا wikiid هست چیز دیگه ای بیاری ،یا باید select نهایی رو از روی 2 فیلدی که گفتم بزنی ،یا از روی اون دوتا با یه select دیگه id رو بیاری،قبلا نتیجه ی اولی رو تو یه جدول مجازی ذخیره کن

PrinceDotNet
پنج شنبه 05 شهریور 1388, 20:24 عصر
من فایل اصلی این بانک رو می ذارم اگه میشه اینو خورت زحمتشو بکش.

ممنون.

محمد سلیم آبادی
پنج شنبه 05 شهریور 1388, 21:21 عصر
حالا شد!
اگر درست متوجه شده باشم شما می خواهید آخرین ویرایش های 10 صفحه ی آخری که در جدول درج شده است را بدست آورید.



SELECT TOP 10 *
FROM
(
SELECT *,
ROW_ID=ROW_NUMBER()
OVER (PARTITION BY TitleId ORDER BY Version DESC)
FROM [Content]
) AS D
WHERE ROW_ID=1
ORDER BY VersionDate DESC

PrinceDotNet
پنج شنبه 05 شهریور 1388, 22:50 عصر
ممنونم دوست من.
حالا اگر بخوام فیلد های Titile.name و Title.slug رو وقتی content.TitleId = Title.Id هستش join کنم باید از چه کوئری ای استفاده کنم ؟

محمد سلیم آبادی
پنج شنبه 05 شهریور 1388, 23:04 عصر
اول بگید که query که در پست شماره 7 قرار داده ام نیاز شما را بر طرف می کند؟

بعد این query رو امتحان کنید ببینید به خواسته خود می رسید یا نه؟





SELECT TOP 10 *
FROM
(
SELECT *,
ROW_ID=ROW_NUMBER()
OVER (PARTITION BY TitleId ORDER BY Version DESC)
FROM [Content]
) AS D INNER JOIN Title t ON D.titleid=t.id
WHERE ROW_ID=1
ORDER BY VersionDate DESC

PrinceDotNet
پنج شنبه 05 شهریور 1388, 23:27 عصر
بله دوست عزیز ممنون
هم اون کد و هم این کد نیاز منو برطرف کرد!
بیساز ممنونم

محمد سلیم آبادی
پنج شنبه 05 شهریور 1388, 23:48 عصر
نیاز مرا برطرف کرد


یک سوال: شما می خواهید آخرین ویرایش های 10 عنوان آخری که در جدول title درج شده است را به نمایش در بیاورید؟

می توانید از این query استفاده کنید، به خطی که به رنگ رانجی در آمده است توجه کنید!



/*------------------------
select id, cast([name] as nvarchar(25)) , cast(slug as nvarchar(25)) from title
------------------------*/
id
----------- ------------------------- -------------------------
1 Home home
2 Silverlight Support silverlight-support
3 Video Support video-support
4 RSS Support rss-support
5 Syntax Highlighting Suppo syntax-highlighting
6 Formatting and Layout formatting-and-layout
7 Basic Text Formatting basic-text-formatting
8 Headings headings
9 Code Blocks code-blocks
10 Escaped Markup escaped-markup
11 Lists lists
12 Tables tables
13 Horizontal Rules horizontal-rules
14 Text Alignment text-alignment
15 Links links
16 Images images

(16 row(s) affected)



SELECT TOP 10 *
FROM
(
SELECT *,
ROW_ID=ROW_NUMBER()
OVER (PARTITION BY TitleId ORDER BY Version DESC)
FROM [Content]
) AS D INNER JOIN Title t ON D.titleid=t.id
WHERE ROW_ID=1
ORDER BY t.id DESC

PrinceDotNet
جمعه 06 شهریور 1388, 00:54 صبح
نه من وقتی از این کوئری استفاده جواب درست رو بهم نمیده! همون قبلیه درست بود!

بازم ممنون

محمد سلیم آبادی
جمعه 06 شهریور 1388, 01:23 صبح
یک سوال: چرا تمام نسخه های مختلف یک نوشته (صفحه) را می خواهید ذخیره کنید؟ آیا مثلا برای back up گیری این کار را انجام می دهید؟

PrinceDotNet
شنبه 07 شهریور 1388, 21:49 عصر
آره
چون من این صفحه رو به عنوان ویکی استفاده می کنم که همه ی کاربرا می تونن تغییرش بدن! اینطوری یک بک آپ برای اطمینان موجود هستش!