PDA

View Full Version : سوال: مرتب سازي خاص



hossein taghi zadeh
چهارشنبه 13 شهریور 1387, 12:35 عصر
با سلام

در ديتابيس برنامه، اطلاعات مربوط به كتب مختلف ذخيره ميگردد.
هر كتاب، يك سري پديدآورندگان دارد كه ممكن است نقش‌هاي مختلف (نويسنده مترجم و ...) داشته باشند.
(براي مثال يك كتاب ممكن است يك سري نويسنده داشته باشد)

كتاب‌ها در جدول tblBook
و پديدآورندگان در جدول tblCreators ذخيره مي‌گردند و ارتباط اين دو جدول بر اساس فيلد
ElementsID مي باشد كه فيلد كليد در جدول كتب مي‌باشد. رابطه‌ي جدول tblBook و tblCreators
يك به N مي باشد.

چطور ميتوان كتب را بر اساس نام نويسندگان مرتب نمود؟

شرح جداول:
جدول tblBook
فيلدها ElementsID, Title, Tirage, ...

جدول tblRoles (نقش‌ها: نويسنده، مترجم، ويراستار و ...)
فيلدها RolesID, Name

جدول tblPersons (اشخاص)
فيلدها PersonsID, Name, Family, ...

جدول tblCreator (پديدآورندگان: فيلد PersonsID ارجاعي به جدول tblPersons و فيلد RolesID ارجاعي به جدول tblRoles و
ElementsID ارجاعي به جدول tblBook)
فيلدها ElementsID, PersonsID, RolesID

mannai29
چهارشنبه 13 شهریور 1387, 15:24 عصر
شما باید از join بین جدولهایتان استفاده کنید و پس از بدست آوردن فیلدهای مورد نظر از جمله نام نويسنده آن را در یک order ساده قرار دهید . در مورد join هم درون Help SQL-Server کاملا توضیح داده شده است.

hossein taghi zadeh
چهارشنبه 13 شهریور 1387, 15:38 عصر
شما باید از join بین جدولهایتان استفاده کنید و پس از بدست آوردن فیلدهای مورد نظر از جمله نام نويسنده آن را در یک order ساده قرار دهی

طبق توضيحاتي كه دادم،


هر كتاب، يك سري پديدآورندگان دارد كه ممكن است نقش‌هاي مختلف (نويسنده مترجم و ...) داشته باشند.
(براي مثال يك كتاب ممكن است يك سري نويسنده داشته باشد)

در صورت join كردن و اعمال يك order by ساده به علت وجود 0..n نويسنده براي هر كتاب، در
نتايج خروجي هر سطر جدول كتب به تعداد نويسنده‌هايش خواهد بود

در ضمن از DISTINCT نيز نمي توان استفاده نمود به علت اينكه از فيلدهاي Name, Family كه در قسمت
Order by استفاده شده اند نيز بايد در قسمت Select بيايند كه در اينصورت DISTINCT هيچ فايده اي نخواهد داشت.

چطور از تكراري بودن سطرها در خروجي كد زير جلوگيري كنم؟


SELECT TOP 100 PERCENT dbo.VIEW_Book.*
FROM dbo.tblCreators INNER JOIN
dbo.VIEW_Book ON dbo.tblCreators.ElementsID = dbo.VIEW_Book.ElementsID INNER JOIN
dbo.tblRoles ON dbo.tblCreators.RolesID = dbo.tblRoles.RolesID LEFT OUTER JOIN
dbo.tblPersons ON dbo.tblCreators.PersonsID = dbo.tblPersons.PersonsID
WHERE (dbo.tblRoles.Name = N'نويسنده')
ORDER BY dbo.tblPersons.Family, dbo.tblPersons.Name

AminSobati
چهارشنبه 13 شهریور 1387, 22:13 عصر
وقتی یک کتاب بیش از یک نویسنده داره چه منطقی برای Sort کردن کتابها میشه قرار داد؟ فرض کنین کتاب اول دو نویسنده به نامهای x و y داره، کتاب دوم دو نویسنده به نامهای a و z. در این وضعیت با Sort مورد نظر شما کدوم کتاب باید اول ظاهر بشه و چرا؟

mannai29
پنج شنبه 14 شهریور 1387, 09:12 صبح
در صورت join كردن و اعمال يك order by ساده به علت وجود 0..n نويسنده براي هر كتاب، در
نتايج خروجي هر سطر جدول كتب به تعداد نويسنده‌هايش خواهد بود
وقتی یک کتاب بیش از یک نویسنده دارد این یک امر طبیعی است

در ضمن از DISTINCT نيز نمي توان استفاده نمود
لزومی برای استفاده از دیستینکت وجود ندارد...
من فکر می کنم شما منظورتان را از خروجی مورد نظر دقیق بیان نکرده اید.

hossein taghi zadeh
پنج شنبه 14 شهریور 1387, 13:26 عصر
با سلام


وقتی یک کتاب بیش از یک نویسنده داره چه منطقی برای Sort کردن کتابها میشه قرار داد؟ فرض کنین کتاب اول دو نویسنده به نامهای x و y داره، کتاب دوم دو نویسنده به نامهای a و z. در این وضعیت با Sort مورد نظر شما کدوم کتاب باید اول ظاهر بشه و چرا؟

به علت اينكه در خروجي برنامه، نام نويسندهاي كتاب، پشت سرهم مي‌آيد.
در مثال نام نويسنده‌ي كتاب اول x; y و نام نويسنده‌ي كتاب دوم a; z در خروجي چاپ مي‌شود.
و در اينصورت پس از مرتب سازي بايست ابتدا كتاب دوم و سپس كتاب اول بيايد.


لزومی برای استفاده از دیستینکت وجود ندارد...
به علت اينكه براي هر كتاب چند نويسنده وجود دارد، سطر مربوط به هر كتاب به تعداد نويسنده‌ها
تكرار مي‌شود. كه در اينصورت براي تكرار نشدن اضافي هر سطر، بايد از Distinct استفاده نمود.
در ضمن فيلد نام نويسنده در قسمت Select آوردن نشده است.

AminSobati
پنج شنبه 14 شهریور 1387, 14:44 عصر
در مثال نام نويسنده‌ي كتاب اول x; y و نام نويسنده‌ي كتاب دوم a; z در خروجي چاپ مي‌شود.
و در اينصورت پس از مرتب سازي بايست ابتدا كتاب دوم و سپس كتاب اول بيايد.



یعنی پس همیشه نام نویسنده اول مد نظر هست؟ نام نویسنده های بعدی در Sort شرکت نمیکنه؟
دقت داشته باشید که نام نویسنده های مختلف در رکوردهای مختلف قرار داره

hossein taghi zadeh
پنج شنبه 14 شهریور 1387, 22:38 عصر
یعنی پس همیشه نام نویسنده اول مد نظر هست؟ نام نویسنده های بعدی در Sort شرکت نمیکنه؟

مهم اينست كه در خروجي اطلاعات كتاب بر اساس نام نويسنده، مرتب باشد و نويسنده‌ي اول و دوم
مطرح نيست.
در خروجي مي‌توان مرتب شده‌ي ليست نويسندگان را نوشت. براي مثال
نويسندگان كتاب اول
z
f
a
و نويسندگان كتاب دوم
d
c
كه در اينصورت نويسندگان كتاب اول a;f;z و كتاب دوم c;d كه در اينصورت ابتدا كتاب اول و سپس
كتاب دوم مي‌آيد



دقت داشته باشید که نام نویسنده های مختلف در رکوردهای مختلف قرار داره
اگر منظورتان را درست متوجه شده باشم، خير دو كتاب مختلف ممكن است نويسنده‌ي يكساني در ليست نويسندگانشان داشته باشند. (اگر منظورتان وجود نداشتن نويسنده‌ي تكراري در ليست نويسندگان يك كتاب، نباشد)

فكر ميكنم اگر بتوانيم براي هر كتاب فقط و فقط يك نويسنده را به عنوان كانديد نويسندگان براي مرتب سازي در نظر بگيريم، مشكل حل شود.

AminSobati
پنج شنبه 14 شهریور 1387, 23:43 عصر
درک کردن نحوه Sort شما از توان بنده خارجه! اگر کتابی دو نویسنده a و b داشته باشه، کتاب دیگری نویسنده های a و c و کتاب دیگری b و a و c در این حالت خروجی Sort شما چیه؟

hossein taghi zadeh
جمعه 15 شهریور 1387, 12:09 عصر
درک کردن نحوه Sort شما از توان بنده خارجه!
قبول دارم نتونستم خوب توضيح بدم.


اگر کتابی دو نویسنده a و b داشته باشه، کتاب دیگری نویسنده های a و c و کتاب دیگری b و a و c در این حالت خروجی Sort شما چیه؟

خروجي مرتب سازي: (مرتب سازي بر اساس اتصال ليست مرتب نام نويسندگان)
a;b
a;b;c
a;c

mannai29
شنبه 16 شهریور 1387, 09:17 صبح
ابتدا در یک select داده های خود را به ترتیب بر اساس نام کتاب و بعد نام نویسنده sort کنید و خروجی را با یک cursor بخوانید سپس در cursor برای هر کتاب نام نویسنده ها را به هم بچسبانید و در یک جدول موقت بریزید .یعنی وقتی رکوردها را می خوانید تا نام کتاب عوض نشده نام نویسنده را به هم بچسبانید.در پایان روی جدول موقت select بزنید و sort کنید بر اساس فیلد نام نویسنده.

امیدوارم آشکار گفته باشم.