לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

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



  #3  
ישן 15-12-2007, 23:43
  GreenBerret GreenBerret אינו מחובר  
 
חבר מתאריך: 13.12.05
הודעות: 1,963
בתגובה להודעה מספר 1 שנכתבה על ידי fcf שמתחילה ב "שינוי מידע במספר רב של שורות"

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

היתרון ברשימת תגובות הוא שאינך צריך לסדר אותן לפי סדר מסויים בכל פעם מחדש, אתה יכול לסדר אותן לפי הID והרשימה תסתדר מעצמה לפי התאריך (במידה וזהו ID אוטו').

אני לא מצליח למצוא מאמר שקראתי פעם אבל ישנה עוד דרך, אומנם קצת "טיפשה" אבל דרך טובה ליישום שכזה.
זה הולך להיות קצת ארוך אז תסלח לי
ניצור טבלה חדשה:
קוד:
CREATE TABLE nested_comments ( id INT AUTO_INCREMENT PRIMARY KEY, contents VARCHAR(255) NOT NULL, parent_id INT NULL, parents VARCHAR(50) );


טבלה זו באה לייצג עץ פשוט. השדה id יכיל כמובן את המזהה האישי של כל תגובה.
השדה parent_id יכיל את המזהה של התגובה שאליה הגיבו.
השדה parents הוא שדה מיוחד, והוא מכיל את המזהים של כל העץ עם הפרדה של נקודות.

תכונות של אלמנט שורש "root": ערך ה parent_id שלו הוא NULL, וכמובן parents ריק.
תכונות של אלמנט ילד: ערך ה parent_id שלו הוא מזהה כלשהו, parents אינו ריק ומסתיים בנקודה.

נכניס כמה ערכים לטבלה:
קוד:
INSERT INTO nested_comments SET contents = 'Root 1', parent_id = NULL, parents = ''; INSERT INTO nested_comments SET contents = 'Child 1 of root 1', parent_id = 1, parents = '1.'; INSERT INTO nested_comments SET contents = 'Child 2 of root 1', parent_id = 1, parents = '1.'; INSERT INTO nested_comments SET contents = 'Root 2', parent_id = NULL, parents = ''; INSERT INTO nested_comments SET contents = 'Child 1 of root 2', parent_id = 4, parents = '4.'; INSERT INTO nested_comments SET contents = 'Child 1 of child 1', parent_id = 5, parents = '4.5.'; INSERT INTO nested_comments SET contents = 'Child 1 of child 1', parent_id = 2, parents = '1.2.';


עכשיו הטבלה שלנו נראית כך:
קוד:
+----+--------------------+-----------+---------+ | id | contents | parent_id | parents | +----+--------------------+-----------+---------+ | 1 | Root 1 | NULL | NULL | | 2 | Child 1 of root 1 | 1 | 1. | | 3 | Child 2 of root 1 | 1 | 1. | | 4 | Root 2 | NULL | NULL | | 5 | Child 1 of root 2 | 4 | 4. | | 6 | Child 1 of child 1 | 5 | 4.5. | | 7 | Child 1 of child 1 | 2 | 1.2. | +----+--------------------+-----------+---------+

שים לב שאני בחרתי את הערכים כרצוני ובציפייה למה שיוגדר, כמובן שמתוך PHP תצטרך לבחור את ההורה ו/או את העץ שלו.
עכשיו אנחנו יכולים לבחור את כל העץ כולו בסדר הנכון.
לדוגמא:
קוד:
SELECT nested_comments.*, CONCAT(parents, id, '.') AS orderme FROM nested_comments ORDER BY orderme;

שאילתה זו תחזיר לנו את הטבלה הזו:
קוד:
+----+--------------------+-----------+---------+---------+ | id | contents | parent_id | parents | orderme | +----+--------------------+-----------+---------+---------+ | 1 | Root 1 | NULL | NULL | 1. | | 2 | Child 1 of root 1 | 1 | 1. | 1.2. | | 7 | Child 1 of child 1 | 2 | 1.2. | 1.2.7. | | 3 | Child 2 of root 1 | 1 | 1. | 1.3. | | 4 | Root 2 | NULL | NULL | 4. | | 5 | Child 1 of root 2 | 4 | 4. | 4.5. | | 6 | Child 1 of child 1 | 5 | 4.5. | 4.5.6. | +----+--------------------+-----------+---------+---------+


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

באותה מידה, נוכל גם לבחור את כל הצאצאים של פריט מסוים (למשל פריט מספר 1) באמצעות שאילתה פשוטה:
קוד:
SELECT nested_comments.*, CONCAT(parents, id, '.') AS orderme FROM nested_comments WHERE parents LIKE '1.%' ORDER BY orderme;


מה שיחזיר לנו את התוצאה הבאה:
קוד:
+----+--------------------+-----------+---------+---------+ | id | contents | parent_id | parents | orderme | +----+--------------------+-----------+---------+---------+ | 2 | Child 1 of root 1 | 1 | 1. | 1.2. | | 7 | Child 1 of child 1 | 2 | 1.2. | 1.2.7. | | 3 | Child 2 of root 1 | 1 | 1. | 1.3. | +----+--------------------+-----------+---------+---------+


אני מניח שמפה תוכל להמשיך לבד, כמובן שאתה יכול להוסיף כל מספר שדות שתרצה לטבלה הזו.
בכל הכנסה למסד הנתונים תצטרך לדאוג שהינך שם את הערך הנכון בparents: מה שאני תמיד שם הוא חיבור הערכים parents ו id (עם הוספה של נקודה) של ההורה שאליו מוסיפים את הילד.
שוב אני אחזור ואומר, שיטה זו היא מאוד פרימיטיבית ומסתמכת על כך שתרצה למשוך את הנתונים
בסדר שהם נוצרו.

טוב הבלוקים של הקוד לא הסתדרו לי כל כך טוב, תנסה להעתיק אותם לאיזה עורך טקסט לנסות לערוך אותם שיסתדרו לך.

נערך לאחרונה ע"י GreenBerret בתאריך 15-12-2007 בשעה 23:51.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

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

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 12:50

הדף נוצר ב 0.05 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר