ABA


"שאלה | איחוד טבלאות (JOIN) ב MYSQL ורשומות כפולות."
גירסת הדפסה        
קבוצות דיון בניית אתרים נושא #15587 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15587
שרון אורן 
חבר מתאריך 27.5.02
259 הודעות
   14:36   11.02.10   
אל הפורום  
  שאלה | איחוד טבלאות (JOIN) ב MYSQL ורשומות כפולות.  
 
   שלום.

יש לי 2 טבלאות.

MESSAGES


id | body | loc
------------------------
1 | TEST | 011
2 | BLAB | US
3 | BLAB | 100
4 | BLAB | HaDarom

ועוד טבלה של המיקומים:

id | country country_code REGION | city
-------------------------------------------------------
011 | CANADA CA North | Toronto
025 | United states US New yorl | New york
028 | United states US California| Beverly Hills
100 | ISRAEL IL Jerusalem | Jerusalem
101 | ISRAEL IL Hadarom | Eilat


זה המשפט שלי:

SELECT * FROM messages LEFT JOIN world_cities ON (messages.loc = world_cities.id OR
messages.loc = world_cities.country_code OR messages.loc = world_cities.region)

הבעיה שלי היא כזאת:
כמו שניתן לראות בטבלה של הערים יש כפילויות. שהם באות לידי ביטוי בשליפה. הוא שולף ומראה לי רשומות כפולות. ז"א הוא רץ על כל ערך שיש בטבלה MESSAGES כפול מספר הפעמים שהוא מופיע בטבלת הערים.

ניסיתי לעשות GROUP BY באופן הבא:


SELECT * FROM messages LEFT JOIN world_cities ON (messages.loc = world_cities.id OR
messages.loc = world_cities.country OR messages.loc = world_cities.region) GROUP BY world_cities.country

כאשר הפלא הסופי אמור להיות:


id | body | loc
------------------------
1 | TEST | Toronto
2 | BLAB | United states
3 | BLAB | Jerusalem
4 | BLAB | HaDarom

תודה מראש

פתיחת אייפונים נעולים לסים פרי
https://www.unlock-it.co.il


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אממ שמשון פישטונה 11.02.10 17:28 1
     כאשר אני עושה GROUP BY יש בעיוה שרון אורן  11.02.10 17:49 2
  תנס משהו כזה... CaTz 11.02.10 20:19 3
     זה עובד בסדר.... אבל עדיין יש צורך ב GROUP BY שרון אורן  12.02.10 13:12 4
         אממ GROUP BY בסופו של דבר לא אמור להאט לך שמשון פישטונה 12.02.10 13:23 5
             יש אינדקוס לשדות הרלוונטים שרון אורן  12.02.10 14:00 6
                 איך סוג שדה שמת איפה שיש לך טקסט? CaTz 12.02.10 15:35 7
                     ד''א, כשאתה עושה שloc שווה לUS CaTz 12.02.10 15:44 8
                         הכל VAR CHAR שרון אורן  12.02.10 18:41 9
                             אני צריך את הDUMP כדי לשחק איתו אצלי במחשב... CaTz 12.02.10 20:07 10
                                 US = United States שרון אורן  13.02.10 05:04 11
                                     אבל שוב... CaTz 13.02.10 08:29 12
                                         לא הסברתי את עצמי נכון. או שלא הבנת שרון אורן  13.02.10 12:18 13
                                             תראה... CaTz 13.02.10 14:13 14
                                                 מכתב שרון אורן  14.02.10 16:43 15
  עדכון שרון אורן  15.02.10 13:00 16
     את האמת רציתי לשאול אותך למה אתה לא עושה את זה CaTz 16.02.10 00:08 17
         ככה קיבלתי אותה.. שרון אורן  16.02.10 13:02 18

       
שמשון פישטונה

   17:28   11.02.10   
אל הפורום  
  1. אממ  
בתגובה להודעה מספר 0
 
   לדעתי אתה צריך להכניס לGROUP BY כול שדה שעלול ליהיות בו כפילויות, כמו שאני רואה את זה יש גם מבCountry Code כפילות תנסה להוסיף גם אותו לGROUP BY.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שרון אורן 
חבר מתאריך 27.5.02
259 הודעות
   17:49   11.02.10   
אל הפורום  
  2. כאשר אני עושה GROUP BY יש בעיוה  
בתגובה להודעה מספר 1
 
  

id | body | loc
------------------------
1 | TEST | 011
2 | BLAB | US
3 | BLAB | 100
4 | BLAB | HaDarom
5 | BLAB | US

במקרה הזה הוא יקבץ לי את ה US במקום שיהיה פעמיים יהיה רק פעם אחת.

פתיחת אייפונים נעולים לסים פרי
https://www.unlock-it.co.il


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
CaTz
חבר מתאריך 2.10.04
14537 הודעות
   20:19   11.02.10   
אל הפורום  
  3. תנס משהו כזה...  
בתגובה להודעה מספר 0
 
  

Select messages.*, world_cities.city From messages Left Join world_cities ON (messages.loc = world_cities.id OR
messages.loc = world_cities.country OR messages.loc = world_cities.region)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שרון אורן 
חבר מתאריך 27.5.02
259 הודעות
   13:12   12.02.10   
אל הפורום  
  4. זה עובד בסדר.... אבל עדיין יש צורך ב GROUP BY  
בתגובה להודעה מספר 3
 
   הנה מה שעשיתי ובינתיים לפי בדיקות ראשוניות עובד טוב:


SELECT messages.* , world_cities.city,world_cities.country_name FROM
messages LEFT JOIN world_cities ON ( messages.location =
world_cities.id OR messages.location=world_cities.country_code)
GROUP BY messages.subject, messages.location

מנוסח קצת שונה בשמות הטבלאות וכו' אבל אין בעיה להבין.

הנקודה עכשיו הבעייתית היא כזאת:
השאילתא ממש ממש ממש איטית. זה כאילו על כל רשומה שיש לו בטבלת MESSAGES הוא מריץ שאילתא נוספת על טבלת ה CITIES. (אני יודע שזה אמור להיות ככה וזאת בדיוק הנקודה של השאילתא המורכבת הזאת). הבעיה היא שטבלת CITIES גדולה למדי וזה מאט לי מאוד מאוד את השאילתא.

ככה שהפתרון של ה GROUP BY הוא סוג של פתרון 'שכונה' אני בטוח שיש משהו יותר טוב

תודה

פתיחת אייפונים נעולים לסים פרי
https://www.unlock-it.co.il


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שמשון פישטונה

   13:23   12.02.10   
אל הפורום  
  5. אממ GROUP BY בסופו של דבר לא אמור להאט לך  
בתגובה להודעה מספר 4
 
   את השליפה.

אני מניח שגם השאילתא לא כזאת מורכבת כדי שיהיה איזה שהוא שיפור משמעותי שייגרום לה לרוץ מהר יותר.

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

עוד משהו שאתה יכול לעשות, זה לשלוף את הנתונים, ואת הfilter במקום לעשות בשאילתא לעשות בשפה עצמה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שרון אורן 
חבר מתאריך 27.5.02
259 הודעות
   14:00   12.02.10   
אל הפורום  
  6. יש אינדקוס לשדות הרלוונטים  
בתגובה להודעה מספר 5
 
   אני אבדוק כמה אופציות ואעדכן פה

תודה לכולם

פתיחת אייפונים נעולים לסים פרי
https://www.unlock-it.co.il


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
CaTz
חבר מתאריך 2.10.04
14537 הודעות
   15:35   12.02.10   
אל הפורום  
  7. איך סוג שדה שמת איפה שיש לך טקסט?  
בתגובה להודעה מספר 6
 
   אתה לא יכול לשים על שדה מסוג Text אינדקס...
זה חייב להיות varchar


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
CaTz
חבר מתאריך 2.10.04
14537 הודעות
   15:44   12.02.10   
אל הפורום  
  8. ד''א, כשאתה עושה שloc שווה לUS  
בתגובה להודעה מספר 7
 
   אז הוא לא יכול להחזיר לך תשובה אחת, בגלל שהוא לא יודע איזה עיר זו...

אם אתה רוצה אתה יכול לשלוח אליי Dump של הבסיס נתונים אני אראה מה אפשר לעשות...

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


EXPLAIN SELECT messages . * , world_cities.city
FROM messages
LEFT JOIN world_cities ON ( messages.loc = world_cities.id
OR messages.loc = world_cities.country
OR messages.loc = world_cities.REGION )


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שרון אורן 
חבר מתאריך 27.5.02
259 הודעות
   18:41   12.02.10   
אל הפורום  
  9. הכל VAR CHAR  
בתגובה להודעה מספר 8
 
   בקצרה מה שאני צריך זה: יש לי רשימה של הודעות . בשדה של מיקום יכול להיות:

1. קוד מדינה ( US \ IL | CA)
2. שם האיזור (Jerusalem, New York, Ohaio)
3. קוד עיר (002322ת 070548).

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

אם עדיין תרצה DUMO תגיד לי אני אשלח לך

פתיחת אייפונים נעולים לסים פרי
https://www.unlock-it.co.il


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
CaTz
חבר מתאריך 2.10.04
14537 הודעות
   20:07   12.02.10   
אל הפורום  
  10. אני צריך את הDUMP כדי לשחק איתו אצלי במחשב...  
בתגובה להודעה מספר 9
 
   אני מבין את מה שאתה רוצה...אבל שוב...

במידה ואתה כותב US איזה שם עיר אתה רוצה שזה ישלוף לך? מכיוון שיש לך כמה שורות עם הערך US...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שרון אורן 
חבר מתאריך 27.5.02
259 הודעות
   05:04   13.02.10   
אל הפורום  
  11. US = United States  
בתגובה להודעה מספר 10
 
   בגלל זה בשליפה אני אומר לו:

OR massages.location = world_cities.country_code

אני ידאג ל DUMP
תודה גבר

פתיחת אייפונים נעולים לסים פרי
https://www.unlock-it.co.il


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
CaTz
חבר מתאריך 2.10.04
14537 הודעות
   08:29   13.02.10   
אל הפורום  
  12. אבל שוב...  
בתגובה להודעה מספר 11
 
   בגלל שיש לך כמה ערים שתחת הcountry שלהם יש US, כלומר,
יכול להיות לך ניו יורק, אורנג' קאונטי...בשניהם יהיה לך ערך של US.

אתה בסופו של דבר רוצה לשלוף את שם העיר, אבל איך המערכת יכולה לדעת לאיזו עיר התכוונת כשאתה אומר "העיר נמצאת בUS".

אתה מבין את הבעתיות?


אני מחכה לDUMP......


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שרון אורן 
חבר מתאריך 27.5.02
259 הודעות
   12:18   13.02.10   
אל הפורום  
  13. לא הסברתי את עצמי נכון. או שלא הבנת  
בתגובה להודעה מספר 12
 
   ערכתי לאחרונה בתאריך 13.02.10 בשעה 12:41 בברכה, שרון אורן
 
זה יציג: או שם מדינה (אם יש קוד מדינה) או שם של האיזור (אם זה איזור) או עיר אם יש קוד עיר (000110)

צירפתי לך מה שביקשת מקווה שמספיק


זה אחרי שאני עושה את השאילתא ואז עושה בדיקה ב PHP על סוג ואורך השדה ואז יודע מה להחזיר : מדינה עיר או איזור
תודהhttp://rotter.name/User_files/nor/4b767c6150ed6848.jpg

פתיחת אייפונים נעולים לסים פרי
https://www.unlock-it.co.il


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
CaTz
חבר מתאריך 2.10.04
14537 הודעות
   14:13   13.02.10   
אל הפורום  
  14. תראה...  
בתגובה להודעה מספר 13
 
  

Select messages.*, world_cities.city, world_cities.region_name, world_cities.country_name From messages Left Join world_cities ON (messages.location= world_cities.id OR
messages.location= world_cities.country_code OR messages.location = world_cities.region_name) group by messages.id

מה שזה מחזיר לך זה 13 שורות של ההודעות ומוסיף את המידע הרלוונטי לכל עמודה... מה שתצטרך לעשות זה לבדוק את סוג שדה הlocation ולהציג את העמודה המתאימה...

מקווה שפגעתי....


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שרון אורן 
חבר מתאריך 27.5.02
259 הודעות
   16:43   14.02.10   
אל הפורום  
  15. מכתב  
בתגובה להודעה מספר 14
 
   תראה, דבר ראשון שעשיתי.. זה חילקתי את הטבלה הגדולה של הערים לשלושה טבלאות שונות:

1. טבלת מדינות
2. טבלת איזורים במדינות
3. וטבלה אחת עם קישורים מתאים שבעצם היא הטבלה ה'ראשית' של הערים שמקשורת לטבלאות החדשות שעשיתי.

אני בטוח שככה זה יהיה הרבה יותר טוב.
אני אעדכן אותך בהתאם לצורך ולבעיות אם ויהיו.

תודה רבה לך

פתיחת אייפונים נעולים לסים פרי
https://www.unlock-it.co.il


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שרון אורן 
חבר מתאריך 27.5.02
259 הודעות
   13:00   15.02.10   
אל הפורום  
  16. עדכון  
בתגובה להודעה מספר 0
 
   אז כמו שאמרתי, לקחתי את הטבלה הגדולה של הערים וחילקתי אותה ל 3:

1. ראשית - עם הערים וקישור לשדה מפתח לטבלאות החדשות
2. איזורים : מפתח, שם איזור , קוד איזור וקוד מדינה.
3. מדינות: קוד, מדינה, שם מדינה.

וזה הקוד:


SELECT messages.* , world_countries.country_name, world_regions.region_name , world_cities.city
FROM messages
LEFT JOIN world_countries ON (messages.location = world_countries.country_code)
LEFT JOIN world_regions ON (messages.location = world_regions.reg_id)
LEFT JOIN world_cities ON ( messages.location = world_cities.id)

כמובן שכל הטבלאות קיבלו אינדקס בהתאם.

מה דעתך?

פתיחת אייפונים נעולים לסים פרי
https://www.unlock-it.co.il


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
CaTz
חבר מתאריך 2.10.04
14537 הודעות
   00:08   16.02.10   
אל הפורום  
  17. את האמת רציתי לשאול אותך למה אתה לא עושה את זה  
בתגובה להודעה מספר 16
 
   מהתחלה, לדעתי זה הרבה הרבה יותר מסודר... וכמובן אם זה עובד אין שום סיבה שזה לא יהיה "טוב".


שמח לעזור.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שרון אורן 
חבר מתאריך 27.5.02
259 הודעות
   13:02   16.02.10   
אל הפורום  
  18. ככה קיבלתי אותה..  
בתגובה להודעה מספר 17
 
   בכל אופן שלחתי לך הודעה לפרטי

פתיחת אייפונים נעולים לסים פרי
https://www.unlock-it.co.il


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net