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

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

MasterNetwork 29-05-17 16:14

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

דוגמא:
קוד:

id,fname,lname,city
=============
1,dani,biton,tel aviv
2,avi,kahlon,ramat gan

id,pname,pdesc,price
=============
1,vaccum cleaner,blah,12
2,vaccum pump,blah,12

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

Makeapp 29-05-17 19:57

תסביר את עצמך קצת יותר ואולי אצליח להבין.

MasterNetwork 29-05-17 22:03

מצטער על האי הבנה, יסביר יותר טוב עכשיו :)
נגיד וקיימות הטבלאות הבאות
ואני רוצה לחפש בשדות LIKE fname,lname,city
וגם בשדות pname,pdesc
כשבוחרים את 2 הטבלאות, עם או ללא JOIN זה מחזיר את זה מחובר.
fname,lname,city,pname,pdesc באותה השורה.

יש דרך לשמור על הצורה המקורית?
[0]=fname,lname,city
[1]=pdesc,pname

קוד:

users
======
id,fname,lname,city
=============
1,dani,biton,tel aviv
2,avi,kahlon,ramat gan

products
====
id,pname,pdesc,price
=============
1,vaccum cleaner,blah,12
2,vaccum pump,blah,12


anon 30-05-17 10:30

מקבלים תוצאה אחת ולא שתי תוצאות לכן התשובה היא לא.
אתה יכול ליצור כינויים (alias) ולקבל את זה כך

HTML קוד:

t1_id,t1_fname,t1_lname,t1_city,t2_id,t2_pname,t2_pdesc,t2_price
=============
1,dani,biton,tel aviv,1,vaccum cleaner,blah,12
2,avi,kahlon,ramat gan,2,vaccum pump,blah,12
=============


MasterNetwork 30-05-17 11:40

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

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

anon 30-05-17 14:41

אז תריץ שתי שאילתות ותקבל שתי תוצאות

while1 30-05-17 15:18

ציטוט:

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

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

לפי התיאור שלך, להריץ שאילתה אחת עבור 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]}";
   }


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


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

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

MasterNetwork 30-05-17 19:34

בסדר גמור הלוגיקה וגם התחבירים. רציתי לדעת אם להשתמש בUNION זה יהיה לי הכי הגיוני.
פשוט נדאג למס' עמודות זהה.
תודה רבה אחלה דיון, וחג שמח גם לכם :)
אגב, בעקרון הטבלאות כמעט זהות לחלוטין. חוץ מטבלה אחת שהיא שונה לגמרי.
החיפוש יתבצע על עמודות זהות ברוב הטבלאות.

קוד:

  SELECT `id` , `fname` , `lname` , `city` , 'bla1' AS `table_name`
להוסיף אליאס table_name , והבעיה נפתרה לגמרי.

תודה רבה, בדיוק התשובות שהייתי צריך.
|לב| חג שמח חברים!

MisterEdry 04-06-17 10:12

תסביר את עצמך יותר ואוכל לעזור לך

YYDevelopment 25-06-17 05:28

בעבר גם אני נתקלתי בבעיה שרציתי להריץ 2 שאילות בבת אחת וניסיתי למצוא פיתרון. יש פקודה בשם mysqli_multi_query() שאמורה לאפשר לך לעשות את זה וניתן לראות מידע נוסף על הפקודה בעמוד הבא:
https://www.w3schools.com/php/func_m...ulti_query.asp
זה היה לפני הרבה זמן וניסיתי גם לעבוד עם הפקודה אבל בסופו של דבר הגעתי למסקנה שיותר קל להשתמש ב-2 שאילתות שונות ולחבר את הנתונים למשתנה אחד.


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

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