בעיה בשאילתה

  • פותח הנושא koler
  • פורסם בתאריך

koler

New member
בעיה בשאילתה

יש לי שתי טבלאות 1 - products המכילה את המידע על המוצרים 2 - products_price_quotes - מכילה את כל הצעות המחיר למוצרים הבעיה היא שכשאני מנסה לשלוף מוצרים שאין להם הצעות מחיר (רשמות השייכות בproducts_price_quotes) אני לא מקבל תוצאות כלל , איך אני מפריד?
SELECT p.title , p.category , p.id , ps.shop_id, ps.price FROM products AS p JOIN (products_price_quotes AS ps) ON (p.id=ps.product_id) AND p.category=9 AND p.title LIKE '%string%' OR p.details LIKE '%string%'​
תודה
 

flenger

New member
LEFT JOIN

JOIN יקח רק את המשותף בין 2 הטבלאות שלך כלומר רק מוצרים שיש להם הצעות מחיר LEFT JOIN יציג גם את אלה שיש להם הצעות מחיר וגם כאלה שלא כאשר במוצרים שאין להם הצעות מחיר השדות השייכים לטבלה השניה יהיו NULL
 

koler

New member
עכשיו זה בוחר את כל המוצרים

אחרי שעשיתי left join זה בוחר לי את כל הרשומות מטבלת המוצרים , בלי קשר לשאילתת החיפוש כאילו שהחלק הזה איננו קיים כלל:
AND p.title LIKE '%$string%' OR p.details LIKE '%$string%'​
תודה
 

flenger

New member
אוקי :) נעשה לך קצת סדר

בלי קשר הייתי ממליץ לך לקרוא קצת על JOIN , LEFT JOIN ומה ההבדלים בינהם לגבי השאלה שלך כמו שאמרתי שאתה מבצע LEFT JOIN הוא לוקח את המשותפים בין הטבלאות (כלומר את כל אלה שעונים תנאי של הJOIN ) וגם אלה שנמצאים בטבלה מצד שמאל במקרה שלך זה טבלת המוצרים אך לא נמצאים בטבלת המחירים במקרה הזה אתה יכול לעשות LEFT JOIN פשוט ולאחר מכן להשתמש ב WHERE http://www.w3schools.com/sql/sql_join.asp ואפילו בעברית http://he.wikipedia.org/wiki/Join_(SQL)
 

גרי רשף

New member
בהמשך למה ש-flenger כתב

התנאים שב-On מסננים את ההתאמות של הטבלה השניה לראשונה. כלומר- כל השורות של הראשונה יוצגו, ולצידן שורות מהשניה (אם יש) שעונות על תנאי ה-On. אם אתה רוצה לסנן שורות מהטבלה הראשונה - התנאים צריכים להופיע ב-Where. לסיכום- התנאים שכתבת ב-On והתייחסו לטבלה הראשונה לא גרמו לשורות הרלוונטיות ממנה לא להופיע, אלא להופיע ללא התאמה של שורות מהשניה לידן.
 

koler

New member
לפי מה שאתה אומר אני בסדר גמור

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

pitoach

New member
ממש לא

תקרא בעיון מה שנאמר לך (גם גרי וגם flenger הסבירו את אותו דבר כמובן וגם אני אנסה להסביר את אותה נקודה) אתה מבצע סינון על פעולת ה JOIN בעזרת סינון בחלק של ה ON ומה שאתה צריך זה או 1. לבצע זה סינון על התוצאות שמתקבלות מפעולת JOIN אחרי שהפעולה הסתיימה או 2. לסנן תוצאות לפני שבכלל התחילה פעולת ה JOIN ואז לבצע את ה JOIN על התוצאות המסוננות ואת זה מבצעים בעזרת WHERE (שאצלך אין בכלל בשאילתה). ** אני מאוד ממליץ לך בשלב זה לעצור לחלוטין את הנסיון להגיע לפתרון, כי אתה יוצר לעצמך נזק עתידי בנסיון לקפוץ לפתרון בלי להבין את הבסיס. ההמלצה לי היא כאמור לעזוב הכל ולקפוץ ללמוד על JOIN ואת הבסיס של השימוש ב JOIN וכמובן LEFT JOIN. הקישור שהביא לך FLEGER הוא בדיוק הקישור שגם אני הייתי מליץ לך להתחיל בו. הוא קצר וקולע ותוך שעתיים תוכל להבין הכל במקום להשקיע כאן 10 שעות ובסיום עדיין לא תבין ככל הנראה אלא רק תגיע לתוצאה ספציפית לבעיה מסויימת http://www.w3schools.com/sql/sql_join.asp
 

koler

New member
הגעתי לפיתרון .

בסוף הטעות שלי הייתה בכך שלא שמתי where ובראש שלי אני זוכר שכן שמתי:-\
SELECT p.title , p.category , p.id , ps.shop_id, ps.price FROM products AS p LEFT JOIN (products_price_quotes AS ps) ON (p.id=ps.product_id) WHERE p.category>0 AND p.category>0 AND p.title LIKE '%ssss%' OR p.details LIKE '%ssss%'​
אני בהחלט מסכים איתך שחזרה דרושה פה...
 
למעלה