הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   שאלת SQL: ניקוי טבלה מרשומות כפולות (https://hosts.co.il/forums/showthread.php?t=79848)

ahoy 01-12-09 12:48

שאלת SQL: ניקוי טבלה מרשומות כפולות
 
אהלן,

צריך עזרה בשאילתא (סדרת שאילתות) נכונה לניקוי טבלה מרשומות כפולות.

מה יש -
1. טבלת רשומות הכוללות את השדות "זיהוי משתמש" ו-"מספר רשימה" (יש רק משתמש יחידני ומספר רשימות שהוא יכול להיות רשום בהן).
2. קיים רישום של אותו "זיהוי משתמש" בכמה כניסות בטבלה ל-"מספרי רשימות" לא רצויים".

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

תודה מראש.

Shay Ben Moshe 01-12-09 16:59

אני לא בטוח שהבנתי, אבל נראה לי שהכי פשוט יהיה לך לעשות SELECT עם DISTINCT להכל, לנקות את הטבלה ולהכניס אליה את כל הנתונים/להכניס את כל הנתונים לטבלה אחרת (אם אתה מעדיף לא למחוק ישר).

ahoy 01-12-09 20:24

ציטוט:

נכתב במקור על ידי Shay Falador (פרסם 747850)
אני לא בטוח שהבנתי, אבל נראה לי שהכי פשוט יהיה לך לעשות SELECT עם DISTINCT להכל, לנקות את הטבלה ולהכניס אליה את כל הנתונים/להכניס את כל הנתונים לטבלה אחרת (אם אתה מעדיף לא למחוק ישר).

תודה, אבל זה לא זה.

אני צריך לזהות כפילות של שדה מסויים (SUB_ID) במספר כניסות בטבלה. כאשר כול כניסה בטבלה מאופיינת ב-LIST_ID אחר (כלומר, אותו מזהה-משתמש מופיע בכמה רשימות).

אחרי הזיהוי הזה אני צריך למחוק את הכניסה של ה-LIST_ID הלא רצוי. אין לי בעיה להגדיר את ה-LIST_ID למחיקה ו\או להריץ כמה סבבים של ניקוי וכול פעם להתייחס לצמד של LIST_ID'ים.

השאלה - מה השאילתא הנכונה לזה?

Shay Ben Moshe 01-12-09 20:53

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

SUB_ID    LIST_ID
1        1
2        1
1        1
3        2
4        2
1        3
1        3
1        3 

למשהו כזה:
PHP קוד:

SUB_ID    LIST_ID
1        1
2        1
3        2
4        2
1        3 


ahoy 01-12-09 21:03

לא בדיוק, אבל בערך ... כלומר: אני לא רוצה ליצר רשימה חלקית אלא לנקות את הטבלה הקיימת.

כלומר, כרגע יש לי (ואני לא מציג את השדות הנוספים שיש בטבלה):

PHP קוד:

SUB_ID    LIST_ID
1        1
2        1
1        2
3        2
4        2
1        3
3        3
4        1 

ואת זה אני צריך לנקות ל:
PHP קוד:

SUB_ID    LIST_ID
1        1
2        1
3        2
4        2 


Shay Ben Moshe 01-12-09 22:53

יש כמה דרכים לפתור את זה, אתה יכול לשלוף את כל הSUB_IDים עם DISTINCT ואז לשלוף לכל אחד LIST_ID שזו הדרך הטיפשית,
אני ממליץ לך לשלוף הכל מסודר לפי SUB_ID ואז לעבור על הכל עם WHILE, ליצור משתנה עזר lastid ולשים בו כל פעם את הערך של השורה האחרונה, אם הערך הזה לא שווה לשורה הנוכחית להכניס את השורה למערך כלשהו.
אח"כ תנקה את הטבלה.
לבסוף תריץ שאילתות INSERT בשביל להכניס את הנתונים, או שאילתא אחת גדולה, או שתריץ מלא שאילתות DELETE בצורה נורא מורכבת.

anti 04-12-09 18:02

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

ahoy 06-12-09 12:39

זה לא שאתה לא צודק - אבל מבחינת סיבוכיות זה הפתרון הכי גרוע שיכול להיות ... תבין, יש לי כ-40K רשומות להריץ (ואז אתה מבקש ממני לבצע N! של זה ...).


כל הזמנים הם GMT +2. הזמן כעת הוא 21:04.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ