שלח תשובה

זירת השאלות

643
צפיות
20
תשובות

שאלה

,‏ 8 באפריל, 2004

אני משתמש בmysql.
אני מעוניין לשלוף את ששת הרשומות האחרונות שלי ובצורה רנדומלית.
אני מנסה לשלוף בצורה הבאה:


select * from article where permitt1=2 and id>max(id-6)


אבל זה לא ממש עובד….
כיצד עושים זאת?

תגיות:

20 תשובות

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

    נסה את זה:


    select * from article order by rand() limit 6

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

    ע"י dFirst ו-dLast
    לפי קבצי העזרה של האקסס

    DFirst, DLast Functions
    You can use the DFirst and DLast functions to return a random record from a particular field in a table or query when you simply need any value from that field. Use the DFirst and DLast functions in a macro, module, query expression, or calculated control on a form or report.

    DFirst(expr, domain, [criteria])
    DLast(expr, domain, [criteria])

    The DFirst and DLast functions have the following arguments.

    expr – An expression that identifies the field from which you want to find the first or last value. It can be either a string expression identifying a field in a table or query, or an expression that performs a calculation on data in that field . In expr, you can include the name of a field in a table, a control on a form, a constant, or a function. If expr includes a function, it can be either built-in or user-defined, but not another domain aggregate or SQL aggregate function.

    domain – A string expression identifying the set of records that constitutes the domain.

    criteria – An optional string expression used to restrict the range of data on which the DFirst or DLast function is performed. For example, criteria is often equivalent to the WHERE clause in an SQL expression, without the word WHERE. If criteria is omitted, the DFirst and DLast functions evaluate expr against the entire domain. Any field that is included in criteria must also be a field in domain; otherwise, the DFirst and DLast functions return a Null.

    Remarks

    Note If you want to return the first or last record in a set of records (a domain), you should create a query sorted as either ascending or descending and set the TopValues property to 1. For more information, see the TopValues property topic. From Visual Basic, you can also create an ADO Recordset object and use the MoveFirst or MoveLast method to return the first or last record in a set of records.

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

    אני לא סגור על מה שאתה רוצה
    אתה רוצה קודם להגריל ואז לשלוף 6 רשומות אחרונות או קודם לשלוף 6 רשומות אחרונות ואח"כ להגריל את הסדר?

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

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

    var rndNum = Math.Random()*numOfRec
    var query = "SELECT * FROM tbl WHERE id="+rndNum
    rs.Open(query, oConn);

    דרך שנייה (לשלוף ואז להגריל) – לעשות כמו הדרך הראשונה רק שכאן שולפים את כל הרשומות לאחר מכן מעבירים את כל הרקורדסט לתוך מערך getRows ולאחר מכן עושים את הפונקציה שמוציאה את המס' הרנדומלי ושולפים בעזרת ה-getrows את הרשומה שלנו (VBS)


    dim query, rndNum, cntRec
    Randomize()
    query = "SELECT tbl.id FROM tbl"
    rs.Open query,oConn,3
    cntRec = rs.recordCount
    recArray = rs.getRows();
    rndNum = cint((cntRec-1+1)*Rnd()+1)
    Response.Write(recArray(0,rndNum)

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

    תיקון קטן בקוד הJS


    var rndNum = Math.round(Math.random()*numOfRec)
    var query = "SELECT * FROM tbl WHERE id="+rndNum
    rs.Open(query, oConn);

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

    יש דרכים טובות יותר
    ובקשר לראשונה – היא בכלל לא תחזיר לך שש רשומות.

    בכל מקרה אפשר לעשות הכל ברמת ה SQL.

    שליפה רנדומאלית ברמת ה SQL באקסס הולכת בצורה הבאה [בשביל MySql ו SQLServer יש פתרונות אלגנטיים בהרבה]:

    אם אתה רוצה קודם להגרית ואז לשלוף את ששת הרשומות הראשונות זה הולך כך:

    var w=Math.random()*4;
    var x=Math.random()*10;
    var y=Math.random()*3;
    var z=Math.random()*6;
    sql="";
    sql+="SELECT top 6 id,* ";
    sql+="FROM tbl ";
    sql+="ORDER BY cos("+z+"*(sin(cos(-Sin(tan(sqr(id)*"+y+"))*tan(id)*sin(id*tan(id)))/2*"+x+"*tan(id))))*sin(id*tan(id*cos(id)*cos(id)*Sin(id*tan(id*cos(id)))*tan(90-id*cos(id)*sin(id)))*sin("+w+")*cos(id)) DESC";
    rs.Open (sql,Conn);

    אם קודם לשלוף שש ראשונות ואז להגריל את הסדר זה הולך כך:


    var w=Math.random()*4;
    var x=Math.random()*10;
    var y=Math.random()*3;
    var z=Math.random()*6;
    sql="";
    sql+="SELECT id,* ";
    sql+="FROM tbl ";
    sql+="WHERE id in (Select top 6 id from tbl order by id desc) ";
    sql+="ORDER BY cos("+z+"*(sin(cos(-Sin(tan(sqr(id)*"+y+"))*tan(id)*sin(id*tan(id)))/2*"+x+"*tan(id))))*sin(id*tan(id*cos(id)*cos(id)*Sin(id*tan(id*cos(id)))*tan(90-id*cos(id)*sin(id)))*sin("+w+")*cos(id)) DESC";
    rs.Open (sql,Conn);

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

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

    אוריקס?
    מה גרם לך לכתוב את הקוד הזה (חחח)

    var w=Math.random()*4;
    var x=Math.random()*10;
    var y=Math.random()*3;
    var z=Math.random()*6;
    sql="";
    sql+="SELECT id,* ";
    sql+="FROM tbl ";
    sql+="ORDER BY cos("+z+"*(sin(cos(-Sin(tan(sqr(id)*"+y+"))*tan(id)*sin(id*tan(id)))/2*"+x+"*tan(id))))*sin(id*tan(id*cos(id)*cos(id)*Sin(id*tan(id*cos(id)))*tan(90-id*cos(id)*sin(id)))*sin("+w+")*cos(id)) DESC";
    rs.Open (sql,Conn);

    נלקח מה-faq של תפוז

    אני לא בטוח שזה יעבוד באקסס אבל הנה עוד משהו
    לעשות ב-orderBy את הפונקציה newId()

    SELECT * FROM tbl ORDER BY newId()

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

    לא שמתי לב שהוא כתב 6 רשומות אקראיו
    אני התייחסתי לרשומה אחת.
    בכל מקרה לא רפרשתי את הדף ולכן ההודעה למטה לא עדכנית (אבל השאלה שבה כן)
    בשני הדרכים כתבת אותו קוד. אני התחלתי ללמוד רק השנה טריגו (ושהיא תמות אמן) (למרות שאני רק בכיתה ח') אז ככה שלא הבנתי שום דבר מהחלק של ה-order by שיש אצלך

  9. חחחחחח
    מה שמעניין אותי, זה מי חשב על הדרך עם הטריגו'
    אפילו במבחן בגרות 5 יח"ל, אין פונקציות טריגונומטריות מסובכות כל כך

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

    אמנם נלקח מה FAQ של תפוז
    אבל אני כתבתי את זה… אז מותר לי
    [זה הטריד אותי יומיים וידעתי שחייבת להיות דרך, בסוף מצאתי].

    בכל מקרה מה שכתבת יעבוד רק ב SQLServer. ב MySQL יש את Rand().
    הייתי מפקק אותך אבל "צוות האתר" חשב על זה קודם

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

    זה אני פיקקתי את עצמי
    אם לילדה מותר אז גם לי מותר

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

    אז למה אמרת שצוות האתר
    פיקק אותי (והכנס את המושג פיקוק למילון אבן שושן )

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

    צוות האתר לא פיקק אותך
    התשובה לשאלה הזאת הייתה קיימת בFAQ עוד לפני שאתה נתת אותה

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

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

שלח תשובה