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

הוסטס - פורום אחסון האתרים הגדול בישראל (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=86700)

Itay 09-12-10 12:56

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

|234||12||653||7841||4636|
כלומר כל ID תחום ב-||

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

|234||411||12||84441||11||653||7841||31||4636|
למישהו יש מושג איך אני עושה את זה, עדיף רק ב-SQL (אם זה עם PHP אני יכול להסתדר אבל זה יצא ממש כבד לשלוף ככה מאות שורות)

תודה מראש.

Sagi 09-12-10 13:13

דבר ראשון תוציא ככה
HTML קוד:

234,411,12,84441,11,653,7841,31,4636
לאחר מכן תכניס לשאילתא IN
PHP קוד:

SELECT FROM tbl WHERE id IN($X


Itay 09-12-10 13:38

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

אם אני משתמש ב-IN כשהערך IDS (הרשימת ID) הוא רק חלק ולא מסודר באותה צורה של ה-IN זה יעבוד גם?
כאילו משהו כזה:
קוד:

SELECT * FROM tbl WHERE '1,2,4,7' IN('2,3,1,7,6,4,9')

Haimz 09-12-10 13:58

PHP קוד:

<?php
    $row 
= array("234","411","12","84441","11","653","7841","31","4636");
    
$imp implode(","$row);
    
$query "SELECT * FROM `table` WHERE `id` IN(" .$imp")";
    
$select mysql_query($query) or die ("SQL ERROR");
?>

תנסה את זה , לא בדקתי

Itay 09-12-10 19:24

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

Itay 09-12-10 20:22

ניסיתי - זה לא בדיוק עובד
קוד:

SELECT * FROM TST WHERE ContIDs IN('1','2','4','7')
יש בטבלה TST 2 שורות, ה-ContIDs שלהם זה:
'1,2,4,7,8,3,11,'
'1,2,3,4,7,5,6,10,8,9,11,12,'

ניסיתי ב-IN לרשום פשוט '1,2,3,4,5,6,7,8,9,10,11,12', ניסיתי '1,2,4,7' (שזה ההתחלה של המבנה של השורה הראשונה) וכמו שעכשיו. הם לא עובדים..

Haimz 09-12-10 20:30

אם המטרה שלך זה לשלוף משורה שיש בה: '1,2,3,4,7,5,6,10,8,9,11,12,'
תעשה ככה:
PHP קוד:

mysql_query("SELECT * FROM `TST` WHERE `ContIDs` = '1,2,3,4,7,5,6,10,8,9,11,12,'"); 


Itay 09-12-10 20:34

אחי אתה ממש לא בכיוון. תקרא שוב את מה שרשמתי בהתחלה..
תסתכל מה הגבתי לשגיא על העניין של ה-IN

BlueNosE 09-12-10 23:33

לדעתי? אתה יכול לעשות כזה דבר: "WHERE id LIKE '%|23|%' OR ID LIKE '%|11|%' OR id LIKE ...."
ככה השליפה תתבצע בכל מצב כמו שצריך. רק אתה צריך להכין את המחרוזת כמו שצריך.

Daniel 10-12-10 00:39

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

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

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

Itay 10-12-10 03:04

BlueNosE - זה בדיוק למה התכוונתי בהתחלה לתחום את זה ב-||, אבל נראה לי שעם OR LIKE זה לא יעבוד, זה פשוט יתן לי כל דבר שאחד מהאיידיים נמצא בהם.

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

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

Haimz 10-12-10 13:51

PHP קוד:

$user_selected = array("שולחן","מחק","עיפרון"); # user selected items
$this_selected implode($user_selected);
mysql_query("SELECT * FROM `table` WHERE `id` IN(" .$this_selected")"); 

בשביל להכניס את הדברים שהוא בחר למערך (במידה ואתה רוצה) תשתמש בexplode()
זה אמור לבצע את העבודה

Hagaibl 10-12-10 13:54

ציטוט:

נכתב במקור על ידי Hanino (פרסם 788697)
PHP קוד:

$user_selected = array("שולחן","מחק","עיפרון"); # user selected items
$this_selected implode($user_selected);
mysql_query("SELECT * FROM `table` WHERE `id` IN(" .$this_selected")"); 

בשביל להכניס את הדברים שהוא בחר למערך (במידה ואתה רוצה) תשתמש בexplode()
זה אמור לבצע את העבודה

אתה מכניס מערך למערך? בישביל מה?

Itay 10-12-10 14:55

ה-implode פה לא משנה - עשיתי בדיקה כשזה בצורה ידנית.. הוא בכל מקרה יתן לי תוצאה של "שולחן, מחק, עיפרון" (במקרה שלך בלי הפסיקים), וכמו שהבאתי דוגמא אני כבר עשיתי את זה קודם.
ה-IN פה לא נראה לי יעזור, לצערי אני מאמין שגם ה-OR LIKE, למרות שעדיין לא בדקתי אבל זה לא אמור לעבוד.

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

Haimz 10-12-10 15:08

עשיתי טעות קטנה
במקום
$this_selected = implode($user_selected);
צריך לחליף ב
$this_selected = implode(",",$user_selected);

וזה בתור מערך לחיפוש
תוכל לעשות עם פוסטים ולהפריד אותם עם פסיק והלשתמש בIN

BlueNosE 10-12-10 16:02

ציטוט:

נכתב במקור על ידי Itay (פרסם 788710)
ה-implode פה לא משנה - עשיתי בדיקה כשזה בצורה ידנית.. הוא בכל מקרה יתן לי תוצאה של "שולחן, מחק, עיפרון" (במקרה שלך בלי הפסיקים), וכמו שהבאתי דוגמא אני כבר עשיתי את זה קודם.
ה-IN פה לא נראה לי יעזור, לצערי אני מאמין שגם ה-OR LIKE, למרות שעדיין לא בדקתי אבל זה לא אמור לעבוד.

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

יעבוד עם AND like אם אתה צריך שכולם מהרשימה יופיעו

RS324 10-12-10 16:19

ציטוט:

נכתב במקור על ידי BlueNosE (פרסם 788721)
יעבוד עם AND like אם אתה צריך שכולם מהרשימה יופיעו

יש דרך טיפה יותר טובה

אם אתה שומר STRING של ID פשוט תפריד בניהם עם ,(פסיק)

ואז בשאילת תחפש WHERE FIND_IN_SET
וזה יימצא לך בדיוק מה שאתה מחפש....

Itay 10-12-10 16:19

אני לא צריך שכולם יופיעו. אני צריך שרק חלק או כולם יופיעו, מתוך הרשימה שאני נותן.
ושוב אני אתן את הדוגמא של השולחן:
יש לי בטבלה 3 שורות:
1. שולחן, עיפרון, עט, מחק, מנורה
2. שולחן, עט
3. שולחן, מחק, עיפרון, משקפיים

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

ו-Hanino, אתה נשאר על אותו עניין של ה-IN שכבר הסברתי שלא עובד

Itay 10-12-10 16:31

ציטוט:

נכתב במקור על ידי RS324 (פרסם 788725)
יש דרך טיפה יותר טובה

אם אתה שומר STRING של ID פשוט תפריד בניהם עם ,(פסיק)

ואז בשאילת תחפש WHERE FIND_IN_SET
וזה יימצא לך בדיוק מה שאתה מחפש....

ניסיתי לעשות את השיאלתה הזאת:
קוד:

"SELECT * FROM TST WHERE FIND_IN_SET(ContIds, '1,2,3,4,5,6,7,8,9,10,11,12')"
יש לי בטבלה 2 שורות:
1. 1,2,4,7,8,3,11,
2. 1,2,3,4,7,5,6,10,8,9,11,12,

וזה לא הציג לי כלום, יש מצב שלא עשיתי נכון את השאילתה?
ראיתי בתיעוד של mySQL שזה מחפש רק בעמודות מסוג SET אבל אני לא מצליח להחליף את ה-TEXT ל-SET כשהערכים האלה נמצאים שם..

עריכה:
גם כשהחלפתי ל-SET בשביל לבדוק
קוד:

set('1','2','3','4','5','6','7','8','9','10','11','12','13','14')
והשורות עכשיו הן
1. 1,3,5,7
2. 1,2,3,4,5,6,7,8,9,10,11,12,13,14

זה עדיין לא עובד לי, גם כשאני מציין בדיוק את הערכים של שורה 1

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

WHERE '|1||2||3||4||5||6||7||8||9|' LIKE '%ContIDs%'
כשה-ContIDs יהיה מופרד, נגיד הוא מכיל 1,3,5 אז זה יצא משהו כזה:
קוד:

WHERE '|1||2||3||4||5||6||7||8||9|' LIKE '%|1|%' AND LIKE '%|3|%' AND LIKE '%|5|%'

BlueNosE 10-12-10 16:35

ציטוט:

נכתב במקור על ידי RS324 (פרסם 788725)
יש דרך טיפה יותר טובה

אם אתה שומר STRING של ID פשוט תפריד בניהם עם ,(פסיק)

ואז בשאילת תחפש WHERE FIND_IN_SET
וזה יימצא לך בדיוק מה שאתה מחפש....

וואו, תסביר מהר, זה ממש מקל על השימוש בתגיות והכל

בניה 11-12-10 09:48

אני הייתי משתמש פה בקשר ,many to many
http://www.tonymarston.net/php-mysql/many-to-many.html
אבל צריך לעשות בדיקות יעילות, ותלוי בכמה רשומות בכל מסד, כל כמה זמן נכנסת איזו רשומה ואם כדאי להשתמש באינדקסים וכו';P

Itay 11-12-10 14:59

ציטוט:

נכתב במקור על ידי בניה (פרסם 788780)
אני הייתי משתמש פה בקשר ,many to many
http://www.tonymarston.net/php-mysql/many-to-many.html
אבל צריך לעשות בדיקות יעילות, ותלוי בכמה רשומות בכל מסד, כל כמה זמן נכנסת איזו רשומה ואם כדאי להשתמש באינדקסים וכו';P

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

אם אני טועה בקשר ל-many to many אז תתקן אותי, אבל זה בערך מה שהבנתי משם


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

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