View Single Post
ישן 30-05-17, 15:18   # 7
while1
חבר חדש
 
מיני פרופיל
תאריך הצטרפות: Jan 2015
הודעות: 34
Send a message via Skype™ to while1

while1 לא מחובר  

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

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

לצורך העניין:

PHP קוד:
if($table1_checked){
   
// sql where LIKE fname,lname,city
}

if(
$table2_checked){
   
// sql where LIKE pname,pdesc
}

// ... do whatever you want with each table 
ואם החיפוש הוא בכלל רק על טבלה אחת, אז אתה יכול לשנות ל else במקום להריץ את 2 השאילתות.


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

קוד:
SELECT *
FROM `table1`
WHERE `fname` LIKE '%str%' OR `lname` LIKE '%str%' OR `city` LIKE '%str%'

UNION ALL

SELECT *
FROM `table2`
WHERE `pname` LIKE '%str%' OR `pdesc` LIKE '%str%'
שים לב שמספר העמודות שמוחזרות מכל טבלה חייב להיות זהה.
כלומר, אם אתה משתמש בכוכבית(*) אז צריך לוודא שבמקור 2 הטבלאות מכילות את אותו מספר עמודות, לדוגמא במקרה שלך - 4.
אם אתה בוחר את העמודות הספציפיות שאתה רוצה להחזיר, אתה חייב לציין ב2 השאילתות את אותו מספר עמודות.
אם בשאילתה אחת יש לך פחות עמודות, תחזיר עמודה נוספת ריקה או משהו אחר. (דוגמא לזה, בקוד הבא בהמשך הפוסט)

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

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

PHP קוד:
$search $pdo->query("
   SELECT `id` , `fname` , `lname` , `city` , 'bla1'
   FROM `table1`
   WHERE `fname` LIKE '%str%' OR `lname` LIKE '%str%' OR `city` LIKE '%str%'
   
   UNION ALL
   
   SELECT `id` , `pname` , `pdesc` , NULL , 'bla2'
   FROM `table2`
   WHERE `pname` LIKE '%str%' OR `pdesc` LIKE '%str%'
"
);

while(
$data $search->fetch(PDO::FETCH_NUM)){
   if(
$data[4] === "bla1"){
      echo 
"data found on table1: id={$data[0]},fname={$data[1]},lname={$data[2]},city={$data[3]}";
   }
   else if(
$data[4] === "bla2"){
      echo 
"data found on table2: id={$data[0]},pname={$data[1]},pdesc={$data[2]}";
   }

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


**כל הקודים נכתבו בהודעה זו, בלי לבדוק. ייתכנו שגיאות תחביר/לוגיקה.

מקווה שעזרתי,
חג שמח.

Last edited by while1; 30-05-17 at 15:24..
  Reply With Quote