הפרדת תוצאות בסקר

בוזו

New member
הפרדת תוצאות בסקר

לפי משתמשים רשומים ולא רשומים: לפי הצעה של הילדה, הפרדתי את התוצאות ל-2 טבלאות. טבלה ראשונה היא למשתמשים לא רשומים, ויש בה id, questionid, answer ו-hits. פשוט וקל. טבלה שנייה היא למשתמשים רשומים, ויש בה questionid, answerid ו-userid. אין בעיות בהכנסה של הנתונים לטבלה המתאימה, ואין בעיה בהצגת תוצאות של לא רשומים. הבעיה שלי היא איך לספור את המשתמשים הרשומים, כי אין hits למשתמשים רשומים. יש למישהו רעיון
 

בוזו

New member
זה קצת בעייתי, כי

אז אני צריך לעשות משפט select לכל answerid רלוונטי לסקר הנוכחי, בלי שאני יודע כמה תשובות אפשריות יש לסקר. מה שאומר עוד משפט select כדי לבדוק כמה תשובות יש לסקר. זה אומר שאם יש 5 תשובות, אני אצטרך לעשות לפחות 6 גישות ל-DB. לא חבל? אין דרך אחרת?
 

זהר פלד

New member
שימוש ב group by

שאילתה כזו תתן לך את מספר המשתמשים שבחרו תשובה מסויימת על שאלה מסויימת, בתוספת של מספר השאלה ומספר התשובה:
SELECT questionid, answerid, Count(UserId) As numOfAnswers FROM PollResults GROUP BY questionid, answerid​
 

בוזו

New member
אבל אם אף משתמש לא הצביע לתשובה

מסויימת, זה לא ייתן לי כלום
כלומר, אני עדיין לא אדע כמה תשובות יש לסקר X. הבנת?
 

זהר פלד

New member
אז אולי לא הבנתי בדיוק מה אתה רוצה

לשלוף... אם אף משתמש לא הצביע לתשובה מספר 3, לדוגמא, אז פשוט תקבל ב count את המספר 0...
 

בוזו

New member
יכול להיות שלא הבנת את הטבלה שלי

בנויה: אני צריך להפריד את הספירה של סתם גולש, לגולש רשום במערכת (שיכול להצביע פעם אחת בלבד לכל סקר). יש טבלה אחת, panswers, שהיא (כמו במאמר ב-webmaster.org.il) סופרת פשוט הצבעות (של "סתם גולשים"). טבלה נוספת שהילדה הציעה, userpanswers, בה העמודות הן id של היוזר שהצביע, id של התשובה שאליה היוזר הצביע, ו-id של השאלה (או הייתי חייב אותה, אבל כדי לפשט תהליכים החלטתי כן לשים אותה). ככה אני יכול לבדוק אם היוזר הצביע על המאמר הנוכחי באתר, ואם כן אז לוודא שהוא לא יכול להצביע שוב לאותו סקר. להציג את התוצאות של panswers אין לי בעיה, כי יש את hits ואז זה סתם חישוב פשוט. הבעיה שלי היא להציג את התוצאות של userpanswers, כי אין שם hits. לפי השליפה שלך לא יהיו לי 0 על תשובה שעוד לא הצביעו לה. או שאני לא הבנתי אותך?
 

זהר פלד

New member
תשובה שלא בחרו בה לא תופיע במילא,

מכיון שהתשובה נכנסת למסד הנתונים רק כאשר מצביעים לה.
 

בוזו

New member
וזאת בדיוק השאלה שלי

איך אני מבצע את זה למרות שלתשובות שעוד לא הצביעו אין זכר בטלבה הזאת, וכמובן שבצורה הכי יעילה? הפיתרון שאני חשבתי עליו הוא עם הרבה משפטי SELECT: - לשלוף מ-pquestions את כל ה-id הרלוונטיים לסקר הנוכחי ולהכניס את המספרים למערך. - לעשות לולאה שעוברת כל פעם על האיבר הבא במערך, ותשלוף מ-userpanswers את מספר ההצבעות שיש לערך שבמערך. זה אומר שאם יש X תשובות לסקר, אני עושה X+1 משפטי select. אין דרך לצמצם את זה
 

זהר פלד

New member
לא ברור לי מה אתה רוצה לשלוף...

אם אתה רוצה לשלוף את מספר המשתמשים הרשומים שהצביעו עבור כל אחת מהאופציות, תשתמש בשאילתה שכתבתי לך עם ה group by. אופציה שלא הצביעו עבורה פשוט לא תתקבל ב recordset. אם אתה רוצה שגם היא תתקבל ב recordset, אתה יכול להוסיף left join לטבלת השאלות, ואז תקבל 0 במקום של ה count.
 

בוזו

New member
נעשה סדר:

לסקר יש 3 מצבים: סקר שכבר לא פעיל (אי אפשר להצביע אליו יותר), סקר נוכחי פעיל, וסקר שעוד לא הועלה. עכשיו אני מתייחס רק למשתמשים רשומים: בטבלה userpanswers יש questionid, answerid ו-userid. אני מניח שאני לא צריך להסביר מה יש בכל עמודה... אני צריך למצוא דרך יעילה למצוא כמה גולשים רשומים הצביעו על כל תשובה מהתשובות האפשריות לסקר הפעיל. אני רק מחפש דרך יעילה, כי דרך לא-יעילה אני יודע. לפי ה-group by אני מקבל רק את הכמות שהצביעו, אבל אני לא יודע מה ה-id של תשובות שאף אחד לא הצביע. אני לא יודע לאיזה id-ים לתת 0, כי יש אפשרות שלא הצביעו לתשובה מסקר לא-פעיל. שורה תחתונה: אני רוצה לשלוף את כל ההצבעות שנעשו לתשובות של הסקר הפעיל, ולתשובה שלא ענו עליה אני אקבל 0. את הרעיון עם join לא הבנתי, פשוט כי אני לא סגור על איך join עובד
*אני מאוד מקווה שהצלחת לעקוב אחרי הבלאגן הזה, כי את האמת אני איבדתי את עצמי כאן
 

זהר פלד

New member
join פשוט יפתור את הבעיה:

בהנחה ו status פעיל מיוצג ע"י 1, השאילתה תראה בערך ככה (כמובן, תצטרך להתאים את שמות הטבלאות והשדות למה שיש אצלך)
SELECT PR.questionid, PR.answerid, Count(PR.UserId) As numOfAnswers FROM PollResults AS PR LEFT JOIN PollQuestions AS PQ ON(PR.questionid = PQ.questionid) WHERE PQ.QuestionStatus = 1 GROUP BY PR.questionid, PR.answerid​
מכיון שאנחנו משתמשים ב LEFT JOIN, כל השאלות שנמצאות בטבלת השאלות יופיעו, גם אם אין להן רשומות שמתאימות בטבלת התשובות. אתה מוזמן לקרוא את המאמר של ניר טייב ב webmster על join, זה מאמר לא רע בכלל.
 

בוזו

New member
זה לא מחזיר את כל התשובות

אלא את התשובות שמישהו ענה עליהן, בגלל שאין הזכרה של הטבלה הרגילה של התשובות (למשתמשים לא-רשומים). כלומר צריך איכשהו לערב פה את userpollanswers יחד עם panswers, ולא רק עם הטבלה pquestions.
 

זהר פלד

New member
אז אולי פשוט תסביר בדיוק

איך בנויות הטבלאות שלך, ככה שנוכל למצוא פתרון ולא סתם לנחש?
 

בוזו

New member
חשבתי שהסברתי את זה.

אז ככה:
pquestions: id | מספר אוטומטי question | השאלה status | מצב הסקר, 0 עוד לא עלה, 1 פעיל, 2 כבר לא פעיל panswers: משמשת רק למשתמשים לא רשומים id | אוטומטי questionid | שיוך לשאלה answer | התשובה hits | מספר הגולשים הלא רשומים שהצביעו לתשובה puseranswers: משמשת רק למשתמשים רשומים userid | ה-id של היוזר שהצביע questionid | שיוך לשאלה answerid | שיוך לתשובה​
 

זהר פלד

New member
אז השאילתה שהצעתי צריכה לעבוד...

ועכשיו, בהתאמה לשמות הטבלאות והשדות שלך:
SELECT PQ.id, PQ.answerid, Count(PA.UserId) As numOfAnswers FROM pquestions AS PQ LEFT JOIN puseranswers AS PA ON(PQ.id = PA.questionid) WHERE PQ.status = 1 GROUP BY PQ.id, PQ.answerid​
זה יחזיר לך את מספר המשתמשים שהצביעו לכל תשובה של הסקר הפעיל. אם לא הצביעו לתשובה מסויימת, numOfAnswers יחזיר 0. שוב, מכיון שיש שימוש ב left join, תקבל חזרה את כל השורות שמופיעות ב pquestions, גם אם אין להם שורה מקבילה ב puseranswers.
 

בוזו

New member
היא לא עובדת, כי אין קישור לטבלה

panswers. השאילתה שלך מקשרת בין pquestions לבין puseranswers ללא קשר ל-panswers - הטבלה שבה יש את כל התשובות לסקרים.
 
למעלה