שלח תשובה

זירת השאלות

653
צפיות
5
תשובות

שאלה בשליפת נתונים (PHP + MySQL)

,‏ 30 במאי, 2006

שלום לכם,

יש לי את השאילתא הבאה:



$query = mysql_query("select * from $idt where top_id = 0 ORDER BY RAND() LIMIT 1") or die(mysql_error());


כמו שאתם רואים זה שחשוב לי שגם ישלוף רק את מה ש- top_id שווה לאפס, גם שיבחר בצורה רנדומלית וגם שיבחר רק אחד..

עד פה הצלחתי,

עכשיו אני רוצה להוסיף לכל זה שיבחר רק מתוך 30 הערכים האחרונים, ז"א שיבחר ערך רנדומלי בדיוק כמו שכתוב עכשיו רק שהערך הרנדומלי הנ"ל יהיה מתוך 30 הערכים האחרונים שבטבלה ואת זה אני לא יודע איך לעשות..

תודה רבה!

נ.ב.
בתפוז הציע לי ניר טייב לעשות תת שאילתא בצורה הבאה:


$count = mysql_query('SELECT Count('fld') as cnt FROM tbl');
$count = mysql_fetch_array($count);
$count = $count[0];

$offset = $count-30;
$query = mysql_query("select * from (SELECT * FROM $idt LIMIT $offset, $count) as tbl where top_id = 0 ORDER BY RAND() LIMIT 1") or die(mysql_error())


לצערי זה לא עובד (שגיאת תחביר או משהו כזה) ולכן אני מחפש פתרון אחר.

תגיות:

5 תשובות

  1. Shuki142 הגיב:

    מאוד פשוט
    דבר ראשון השאילתה השניה יש לך טעויות רבות, מבחינת השאילתה שרשמת, אין פלא שיש לך טעות תחביר.
    השאילתה השניה אמורה להיות בתוך ה where של השאילתה הראשונה לא כמו שעשית, זה כבר טעות אחת, מאמין שיש עוד לא עברתי על הכל.

    עכשיו לפיתרון שלך.
    האופציה של LIMIT אתה יכול להגיד לה כמה רשומות לשלוף ומאיזה רשומה להתחיל.
    למשל limit 45,15
    נותן לך 15 רשומות החל מהרשומה 45.
    עכשיו אם אתה רוצה להציג רשומה אחת מהשלושים האחרונות אתה עושה דבר מאוד פשוט.
    שלב ראשון, אתה צריך לגלות את כמות הרשומות שיש לך תחת אותה קטגוריה ובעקבות כך תוכל להגיד לשאילתה מאיזה רשומה להתחיל ושזה יהיה מה- 30 הראשונות.
    אני יסביר, נגיד יש לך 100 רשומות ואתה רוצה רק מה- 30 האחרונות אתה צריך להגיד לשאילתה להתחיל מהרשומה ה- 70.
    דוגמא:
    LIMIT 70,1
    מציג רשומה אחת החל מהרשומה ה- 70.
    זה נכון במידה ויש לך 100 רשומות זה יציג לך את רשומה אחת מה- 30 האחרונות.

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

    ועכשיו לקוד שצריך לתת לך כיוון.


    $count = mysql_query('SELECT * FROM tbl');
    $num_rows = mysql_num_rows($count);
    $start = $num_rows-30;

    ואז בשאילתה השניה אתה רושם ב- LIMIT להציג החל מהערך שיש לך במשתנה $start
    דוגמא לשאילתה:


    $query = mysql_query("select * from tbl where top_id = 0 ORDER BY RAND() LIMIT ".$start.",1") or die(mysql_error());

    וזהו בעיקרון זה בערך מה שביקשת.
    מקווה שהסברתי את עצמי כמו שצריך, ושזה עונה לך על השאלה שהצגת.

  2. עוז א הגיב:

    הגיונית אתה צודק.. אבל,
    זה עדיין עושה בעיה.

    בוא נגיד ככה, לפי השיטה שלך, כשאני אומר לו להדפיס נגיד את $start הוא באמת מדפיס את המספר האחרון (מינוס שלושים נגיד).. אבל, כשאני מנסה לשלב את המשתנה הנ"ל בתוך השאילתא הוא אמנם לא מריץ שגיאה אך אינו מראה את הפלט לאחר מכן.. אולי משהו בתחביר ?

    השאילתא:


    $query = mysql_query("select * from $idt where top_id = 0 ORDER BY RAND() LIMIT ".$start.",1") or die(mysql_error());

    והמון תודה!

  3. Shuki142 הגיב:

    אז ככה…
    מה שנתתי לך זה דוגמא, יכול להיות שבאותה טבלה ספציפית אין לך מעל 30 רשומות, למשל יש לך שם 10 שורות ואז אתה מחסיר מזה 30 יוצא לך תוצאה של -20 כמובן שאם תעשה שאילתה כזאת לא יהיה לך שום תוצאות.
    אני הבאתי לך כיוון תשדרג אותו קצת ותגיע למה שאתה צריך.
    אתה צריך לאמת שבאמת יש מעל 30 רשומות בטבלה שאתה בודק, אם אין מעל 30 שורות אתה עושה את השאילתה או כמו שעשית בהתחלה, LIMIT 1 או רושם LIMIT 0,1
    תבדוק אם זה עובד, אני מאמין שזה מה שהיה אצלך.

  4. עוז א הגיב:

    אחי אתה טועה
    מדובר באלפי רשומות בכל טבלה, אולי משהו שתחביר לא נכון ?

  5. עוז א הגיב:

    סידרתי את זה בסוף
    השתמשתי במערך וזהו. תודה

שלח תשובה