שלח תשובה

זירת השאלות

282
צפיות
26
תשובות

קצת ידע ב-SQL אני צריך

,‏ 1 בפברואר, 2004

אני שולף נתונים לצורך סקר כך :::

rs = Server.CreateObject("ADODB.Recordset")
rs.Open("SELECT COUNT(chooseID) AS CntChooseID FROM pp_hits WHERE chooseID=1",oConn)
num1 = parseInt(rs.Fields("CntChooseID"))
rs.Close
rs.Open("SELECT COUNT(chooseID) AS CntChooseID FROM pp_hits WHERE chooseID=2",oConn)
num2 = parseInt(rs.Fields("CntChooseID"))
rs.Close
rs.Open("SELECT COUNT(chooseID) AS CntChooseID FROM pp_hits WHERE chooseID=3",oConn)
num3 = parseInt(rs.Fields("CntChooseID"))
rs.Close
oConn.Close
delete rs,oConn
rs = null

אני כותב ב-JS בצד שרת (סתם הערה)
עכשיו לדעתי יש דרך אחרת כדי לשלוף את הנתונים בשאילתא אחת שתזרז כאן את העניינים למישהו יש רעיון
כי אני לא ממש יודע איזה מן שאילתא יכולה לשלוף לי מאותו שדה כל פעם משהו אחר וגם לחשב ושאני מתכוון למשהו אחר אני מתכוון ב-where אחר
בשאילתא אחת (שדומה לאחרות) כתבתי :::


SELECT COUNT(chooseID) AS CntChooseID FROM pp_hits WHERE chooseID=2

כמובן שאני אשכלל אותה לשאילתא שתזהה גם את ה-ID של הסקר

אבל למשיהו יש רעיון איך לשפר את השליפה כדי שהשליפה תתבצע בשאילתא אחת ולא ב-שלוש שאילתות ???

תגיות:

26 תשובות

  1. אוריקס הגיב:

    כך….
    סורי…


    rs.Open("SELECT COUNT(chooseID) FROM GROUP BY chooseID, oConn)

  2. ניר טייב הגיב:

    תגובה…
    הקוד שלי עובד פשוט לדעתי הוא מבזבז הרבה משאבים של השרת ובכך עושה את ההצגה של הנתונים לאט יותר ולכן אני רוצה לדעת אם יש אפשרות לשאילתא אחרת שתכלול את שלושת השאילותות שלי בצורה מסוימת

  3. mrmistory הגיב:

    ככה עושים את זה…..
    "SELECT COUNT(chooseID) AS CntChooseID FROM pp_hits WHERE chooseID IN (1,2,3)"

  4. זהר פלד הגיב:

    או, לחילופין, שימוש ב OR…
    אני לא זוכר איזה מהם יותר יעיל, אבל אפשר לבדוק את זה בקלות.

  5. אוריקס הגיב:

    אני לא מבין…
    זה בדיוק היעוד המקורי של Group By…

  6. אוריקס הגיב:

    ותיקון קטן:


    rs.Open("SELECT COUNT(chooseID) FROM pp_hits GROUP BY chooseID, oConn)

  7. ניר טייב הגיב:

    שאלה בנוסף…
    נגיד ואני משתמש בשאילתא של mrmistroy איך אני מכניס את הנתונים לשלושה
    משתנים כאשר בכל משתנה יש נתונים אחרים נגיד ב-num1 אני רוצה שיהיה COUNT של כל ה-chooseID שערכם 1 ואני רוצה להשתמש בשאילתא הזו
    אבל אם למישהו יש רעיון יותר טוב אז בבקשה

  8. זהר פלד הגיב:

    אם אני זוכר נכון,
    GROUP BY הרבה יותר "יקרה" מבחינת משאבים מאשר OR או IN ב WHERE.
    למרות שלפי שאלת ההמשך, GROUP BY הוא בהחלט הפתרון הנדרש…

  9. אוריקס הגיב:

    אם אני לא טועה…
    Where לא יתן לך את התוצאה הרצוייה, מכיוון שהוא יכניס לספירה רק את השדות שבהם ה chooseID שווה ל1,2,3 או 4… אך הוא עדיין יחזיר רשומה אחת…

  10. זהר פלד הגיב:

    כן, תשתמש ב Group by, כמו שהציע
    אוריקס, רק שכלל אותו טיפה:

    SELECT chooseID, COUNT(chooseID) AS CountChooseID FROM pp_hits GROUP BY chooseID

    אני מקווה שדי ברור לך מה תקבל ב recordset, ולמה. אם יש צורך בהסברים נוספים, אנחנו עדיין כאן…

  11. ניר טייב הגיב:

    אפשר קצת…
    הסברים כי לא הבנתי איך השאילתא הזאת תעזור לי ???
    ואיך אני מפריד בין הנתונים

  12. אוריקס הגיב:

    הסבר על Group By
    בעקרון Group By משמשת בכדי לעשות מעין "הפרדה" על פונקציות צבירה…

    למשל, אם יש לי טבלה כזאת:


    student_id city

    1 jerusalem
    2 jerusalem
    3 tel aviv
    4 jerusalem
    5 hafa
    6 tel avia

    נריץ עליה שאילתא כזאת:


    Select count(student_id), city From tbl Group By city Order By student_id DESC

    ויתקבל פלט כזה:

    3 jerusalem
    2 tel aviv
    1 haifa

    מה עשינו כאן? במקום לסכום "רגיל" בעצם הורינו לו להפריד כשהוא סוכם… Group By city כלומר סכום ותפריד לפי City – התייחס לכל העמודות שיש בהן אותו city כטבלה נפרדת…

  13. ניר טייב הגיב:

    טוב הבנתי את הכוונה אבל
    איך אני מציב את הנתונים בתוך משתנים

  14. אוריקס הגיב:

    אתה לא בדיוק מציב במשתנים
    המשפט שנתנו לך בתוספת קטנה:


    SELECT chooseID, COUNT(chooseID) AS CountChooseID FROM pp_hits GROUP BY chooseID ORDER BY chooseID

    מחזיר לך טבלה מסודרת לפי choose_ID, כלומר מספר התשובה הגבוהה ביותר יהיה "למעלה". לכן אם יש לך 4 תשובות – 1,2,3,4 אז אתה יודע שקודם אתה מתייחס לתשובה 4, אח"כ ל-3 וכו’.

    בהצלחה

  15. ניר טייב הגיב:

    שאלה קטנה
    זה לא אמור להיות לפי סדר רגיל כאילו 1,2,3,4 וככה כי אין את המילה DESC בסיום הפסוקית ORDER BY

  16. ניר טייב הגיב:

    עכשיו אני רוצה להוסיף עוד משהו…
    אני רוצה להוסיף שדה מטבלה אחרת אז עשיתי את השאילתא הבאה :::


    SELECT pp_hits.chooseID, COUNT(pp_hits.chooseID) AS CountChooseID, pp_choose.chooseDesc AS chooseDesc FROM pp_hits,pp_choose WHERE pp_hits.id=" + Request.QueryString("id") + " GROUP BY pp_hits.chooseID, pp_choose.chooseDesc ORDER BY pp_hits.chooseID

    וכשאני מיג את הנתונים משום מה הוא חוזר לי על הכל 3 פעמיםיענו במקום שזה יציג לי כך :::


    איימי לי 1 2
    אמינם 1 2
    כריסטינה אגילרה 1 2

    זה מציג לי כך :::

    איימי לי 2 1
    אמינם 2 1
    כריסטינה אגילרה 2 1
    איימי לי 3 4
    אמינם 3 4
    כריסטינה אגילרה 3 4

    במה טעיתי בשאילתא
    וזה הקוד שעשיתי כדי להציג :::

    while (!rs.EOF){
    Response.Write( rs.Fields("chooseDesc") + " " + rs.Fields("chooseID") + " " + rs.Fields("CountChooseID") + "<br>" )
    rs.MoveNext
    }


    תודה מראש ניר

  17. ניר טייב הגיב:

    את התוצאה…
    ***זה מציג לי כך :::

    איימי לי 2 1
    אמינם 2 1
    כריסטינה אגילרה 2 1
    איימי לי 3 4
    אמינם 3 4
    כריסטינה אגילרה 3 4

    כך זה מציג :::
    איימי לי 1 2
    אמינם 1 2
    כריסטינה אגילרה 1 2
    איימי לי 2 1
    אמינם 2 1
    כריסטינה אגילרה 2 1
    איימי לי 3 4
    אמינם 3 4
    כריסטינה אגילרה 3 4

  18. ניר טייב הגיב:

    הבעיה…
    נפתרה עשיתי איחוד לא נכון הפרמטרים לאיחוד היו שגועים הנה השאילתא הנכונה


    "Select pp_hits.chooseID, COUNT(pp_hits.chooseID) AS CountChooseID,pp_choose.chooseDesc AS chooseDesc FROM pp_hits, pp_choose WHERE pp_hits.id=" + Request.QueryString("id") + "and pp_hits.chooseID = pp_choose.chooseID GROUP BY pp_hits.chooseID,pp_choose.chooseDesc ORDER BY pp_hits.chooseID

שלח תשובה