משיב מוביל
linq או כל דרך אחרת

שאלה
-
שלום! השאלה הזו משולבת sql, אני מקווה שזה המקום.יש לי טבלה של תלמידים וטבלה של המאפיינים שלהם באין ויש, זאת אומרת שמי שיש לו הוא רשום בטבלה ומי שלא, לא. לדוגמה: אם למשה יש משקפיים אז תופיע לי שורה של userid ו- propertyidשאלה א' - אני רוצה ליצור שאילתה שתחזיר לי תלמיד עם משקפיים.שאלה ב' - אני רוצה ליצור שאליתה שאני לא יודע מראש כמה פרמטרים אני אקבל. לדוגמה יכול להיות שאני אבקש גם משקפיים וגם מחשב נייד. איך אני יכול לעשות את זה?אני מקווה שזה היה מספיק ברור.תודה רבה!אני מחפש פתרון בין אם זה רק בsql ובין אם זה דרך linq, לא כל כך משנה לי העיקר שאני אוכל להביא את הdata לפי הפרמטרים
תשובות
-
ז"א שמה שאתה מחפש זה לא את כל המשתמשים שיש להם לפחות תכונה אחת (כמו שחשבתי קודם) אלא את המשתמשים שיש להם את כל התכונות ברשימה. נכון?
אם כן ניתן למשל להישתמש בפונקציית הדירוג RANK על מנת לדרג את כל התכונות הרלוונטיות (לפי המשתמשים) ואז פשוט לבחור את כל הרשומות בהם מספר הדירוג היה כמספר התכונות שאתה מחפש
וכל מה שנשאר זה להכניס הכל לסוגריים ולבחור מתוך התוצאה הזו רק את הUserId של הרשומות בהם MyRank היה שווה ל 3
* הוספתי בקישור הקודם שאילתה לדוגמה למצב זה. משום מה הפורום מעלה לי שגיאה כשאני מנסה להעלות את הקוד כאן (נראה כמו באג אבטחה מפני שכבתי את ההודעה ב HTML ולא בעזרת העורך כאן וכנראה משהו ממה שכתתי לא מצא כן בעיני המערכת)
- נערך על-ידי pituachMVP, Moderator שבת 17 דצמבר 2011 16:49
- הוצע כתשובה על-ידי pituachMVP, Moderator יום ראשון 10 נובמבר 2013 16:26
- סומן כתשובה על-ידי Eran Sharvit יום חמישי 14 אוגוסט 2014 15:22
כל התגובות
-
-
- נערך על-ידי pituachMVP, Moderator יום שני 12 דצמבר 2011 18:21
-
יש שם מקוצר בו נעזרים בקהילות שרתי מסדי נתונים שאומר הכל ב 2 מילים DDL+DML. כתבתי כמה מילים על הנושא אתמול בעקבות השאלה שלו בפורום אחר ומכיוון שהנושא עולה בכל יומיים ונמאס לי לכתוב הסבר בכל פורום מחדש :-)
הרעיון המרכזי הוא כמו ש IPDD כתב: לכל שאלה יש לספק DDL+DML
* אני מקווה שהצלחתי להעביר בקישור את החשיבות של הנושא ומה זה ואם רוצים אפשר לקפוץ למשפט האחרון שזהה כמעט מילה במילה לזו שנכתבה כאן :-)
- נערך על-ידי pituachMVP, Moderator יום שלישי 13 דצמבר 2011 05:58
-
אתה צודק ואני לגמרי מסכים, ותודה על הסבלנות. הנה אני מצרף את הפרטים הרלוונטים:
CREATE TABLE [dbo].[Zimmers](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[UserName] [nvarchar](150) NOT NULL,
)
CREATE TABLE [dbo].[UserProperty](
[PropertyId] [int] IDENTITY(1,1) NOT NULL,
[PropertyName] [nvarchar](100) NULL,
[CategoryId] [int] NULL,
)
CREATE TABLE [dbo].[UserProperties](
[UserId] [int] NOT NULL,
[PropertyId] [int] NOT NULL
)
מה שאני רוצה בסופו של דבר זה לתת לפונקציה רשימה של PropertiesId (לדוגמה 1 - משקפיים, 2 - שער ארוך) ולקבל חזרה את כל היוזרים שיש להם את כל הפרמטרים. ושאילתה שמביאה את אלו שיש להם לפחות אחד מאלו.
אני מקווה שעכשיו זה יותר ברור, ושוב תודה על הסבלנות.
-
גם אם הדברים ברורים מההתחלה בעקרון יש צורה נאותה לשאול שאלה ולא לבקש ממי שמגיע לעזור שישקיע יותר זמן ממי שמבקש את העזרה
המינימום זה שאת הרקע יכין מי ששואל את השאלה ולא כל אחד ממי שנכנסים לעזור יכין את הרקע מחדש. מה גם שהרקע כמובן עוזר להבין את הבעיה ונותן את הכלים לעזור
ולמרות זאת עד לרגע הזה עוד לא סיפקת לנו את DML :-(
עכשיו הוספת את ה DDL ולכן אנחנו יודעים מה מבנה הטבלאות שלך, וגם את זה צירפת בצורה מקוצרת ולא כללת למשל אינדקסים על הטבלאות או קשרים בין טבלאות ולכן התוצאות שתקבל יהיו בהתאם.. הן לא יהיו מיטביות או יעילות בהכרח למסד הנתונים שלך!
חייבים לזכור ששני שאילתות יכולות לתת תוצאות הפוכות מבחינת יעילות עבור 2 מסדי נתונים שונים במבנה ואפילו עבור אותם DDL עם נתונים שונים. לעיתים ההתאמה של השאילתה למסד הנתונים תלויה רק במבנה ולעיתים אפילו הנתונים עצמן קובעים את הבחירה בין השאילתה הטובה יותר
בכל מקרה העלתי לך בקישור הבא פתרון לדוגמה כללי + כתבתי את השאלה בצורה שאתה היית צריך לשאול עם: DDL+DML+תוצאות מצופות
אני מאוד ממליץ לבדוק לא רק את הפתרון אלא גם את הדרך לשאול לפעמים הבאות כדי לעזור לנו לעזור לך :-)
ariely.info/dnn/Blog/newForumsFAQ/ForumsFAQ351/tabid/159אני מקווה שזה עוזר ועונה לבעיה ואם לא אנא נסח את השאלה שוב עם נתונים לדוגמה ותוצאות מצופות ו מבנה אלמנטים כמו שיש לך במערכת כולל אינדקסים למשל וקשרים בין טבלאות
- נערך על-ידי pituachMVP, Moderator יום חמישי 15 דצמבר 2011 17:36
-
תודה על התשובות והסבלנות. ואתה צודק הייתי צריך להיות סבלני יותר ולקרוא את ההסבר עד הסוף ולהבא אני בהחלט אעשה את זה.
אני אבקש רק עוד דבר אחד ואז אני בהחלט אני לך לנפשך (עד לשאלה הבאה, שתכתב בצורה טובה=)):
הטבלאות הן בהחלט איך שפיתחת בדוגמה שנתת לי.
/************************************************ DML */
insert
[Zimmers] ([UserName])
values
(
'a'
)
insert
[Zimmers] ([UserName])
values
(
's'
)
insert
[Zimmers] ([UserName])
values
(
'd'
)
insert
[Zimmers] ([UserName])
values
(
'f'
)
insert
[Zimmers] ([UserName])
values
(
'g'
)
insert
[Zimmers] ([UserName])
values
(
'h'
)
insert
[Zimmers] ([UserName])
values
(
'j'
)
insert
[Zimmers] ([UserName])
values
(
'k'
)
insert
[Zimmers] ([UserName])
values
(
'e'
)
select
*
from
[Zimmers]
insert
[UserProperty] ([PropertyName],[CategoryId])
values
(
'ש'
,2)
insert
[UserProperty] ([PropertyName],[CategoryId])
values
(
'ד'
,3)
insert
[UserProperty] ([PropertyName],[CategoryId])
values
(
'ג'
,6)
insert
[UserProperty] ([PropertyName],[CategoryId])
values
(
'כ'
,2)
insert
[UserProperty] ([PropertyName],[CategoryId])
values
(
'ע'
,2)
insert
[UserProperty] ([PropertyName],[CategoryId])
values
(
'י'
,5)
insert
[UserProperty] ([PropertyName],[CategoryId])
values
(
'ח'
,6)
insert
[UserProperty] ([PropertyName],[CategoryId])
values
(
'ל'
,6)
select
*
from
[UserProperty]
insert
[UserProperties] ([UserId],[PropertyId])
values
(1,1)
insert
[UserProperties] ([UserId],[PropertyId])
values
(1,3)
insert
[UserProperties] ([UserId],[PropertyId])
values
(1,6)
insert
[UserProperties] ([UserId],[PropertyId])
values
(2,6)
insert
[UserProperties] ([UserId],[PropertyId])
values
(7,2)
insert
[UserProperties] ([UserId],[PropertyId])
values
(5,4)
insert
[UserProperties] ([UserId],[PropertyId])
values
(4,7)
select
*
from
[UserProperties]
אני נותן 1,3,6 ומצפה לקבל 1 שזהו הuserid של הuser שיש לו את כל המאפיינים.
תודה רבה!
נ.ב. אני מקווה שהפעם עשיתי את זה כמו שצריך.
-
ז"א שמה שאתה מחפש זה לא את כל המשתמשים שיש להם לפחות תכונה אחת (כמו שחשבתי קודם) אלא את המשתמשים שיש להם את כל התכונות ברשימה. נכון?
אם כן ניתן למשל להישתמש בפונקציית הדירוג RANK על מנת לדרג את כל התכונות הרלוונטיות (לפי המשתמשים) ואז פשוט לבחור את כל הרשומות בהם מספר הדירוג היה כמספר התכונות שאתה מחפש
וכל מה שנשאר זה להכניס הכל לסוגריים ולבחור מתוך התוצאה הזו רק את הUserId של הרשומות בהם MyRank היה שווה ל 3
* הוספתי בקישור הקודם שאילתה לדוגמה למצב זה. משום מה הפורום מעלה לי שגיאה כשאני מנסה להעלות את הקוד כאן (נראה כמו באג אבטחה מפני שכבתי את ההודעה ב HTML ולא בעזרת העורך כאן וכנראה משהו ממה שכתתי לא מצא כן בעיני המערכת)
- נערך על-ידי pituachMVP, Moderator שבת 17 דצמבר 2011 16:49
- הוצע כתשובה על-ידי pituachMVP, Moderator יום ראשון 10 נובמבר 2013 16:26
- סומן כתשובה על-ידי Eran Sharvit יום חמישי 14 אוגוסט 2014 15:22
-
-
צודק :-)
הקישור מוביל לשרת פיתוח שלי ולא לשרת חי ובגלל זה ייתכן שהוא לא זמין 100% אבל הזמינות שלו דיי גבוהה (אני מניח שפרט לכמה שעות בודדות בשבוע הוא זמין). פשוט נסה שוב וסליחה על הזמינות :-)
אלו מגבלות/החלטות עסקיות. יש בבלוגים (ובעוד כמה אתרים פתוחים כתרומה) יותר מדי כניסות ולכן הפרדתי אותו לשרת פיתוח משרדי. אני לא אשים אתר שנועד רק לבלוגים ותרומה לקהילה על חשבון שרת חי :-)
- נערך על-ידי pituachMVP, Moderator יום ראשון 18 דצמבר 2011 06:53
-
-
מה הסטאטוס של השאלה?
יש סיכוי moshfeu שאתה עדיין כאן ומסמן אתהתשובות כדי לסגור את השרשור?
[Personal Site] [Blog] [Facebook]