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

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

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

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

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


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

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