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

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

GNS 14-10-14 19:08

שליפת כמה IDS
 
היי אני רוצה לשלוף מספר IDS אבל בסדר שלי למשל:

קוד:

SELECT * FROM mytable WHERE id IN (3,1,4)
אני רוצה שהסדר שהם יחזרו יהיה
3
1
4
בדיוק בסדר ששלפתי.

מישהו יודע? (מדובר על SQLite)

אדיר 14-10-14 19:36

תעשה את זה ב- php.
https://www.google.co.il/#q=user-def...ay+sorting+php

תחזיק מערך עם כל ה- IDs האלו, תשפוך אותו לשאילתה ואז כשאתה מקבל את התוצאות תרוץ עליהן עם פונקצית sorting משלך ותסדר את הרשומות שחזרו בהתאם למיקום של ה- id במערך המקורי.
פונקצית המיון מקבלת כל הזמן 2 פרמטרים, האיבר הנוכחי והאיבר הבא, ובהתאם ל- return value שלה המקומות שלהם מתחלפים. היא ממשיכה לרוץ על המערך עד שכל הרשומות מסודרות כמו שצריך.

GNS 14-10-14 19:42

האמת שבstackoverflow נתנו לי את הפתרון:
קוד:

order by instr(',3,1,4,', ',' || id || ',')
וגם את זה:

קוד:

SELECT * FROM mytable WHERE id IN (3,1,4)
ORDER BY
CASE
WHEN id = 3 THEN 1
WHEN id = 1 THEN 2
WHEN id = 4 THEN 3
END

השאלה מה יהיה יותר מהיר - לבצע את המיון בשאילתה או בקוד (JAVA)?

אדיר 14-10-14 19:55

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

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

MAORBARI 14-10-14 22:38

ציטוט:

נכתב במקור על ידי GNS (פרסם 891880)
האמת שבstackoverflow נתנו לי את הפתרון:
קוד:

order by instr(',3,1,4,', ',' || id || ',')
וגם את זה:

קוד:

SELECT * FROM mytable WHERE id IN (3,1,4)
ORDER BY
CASE
WHEN id = 3 THEN 1
WHEN id = 1 THEN 2
WHEN id = 4 THEN 3
END

השאלה מה יהיה יותר מהיר - לבצע את המיון בשאילתה או בקוד (JAVA)?

האופציה הראשונה ממש נראית לי מתאימה לך, אתה יכול לבנות שאילתה דרך JAVA שתחליף פשוט את הערך של ',3,1,4,' לפי סדר משתנה ולפי נתונים משתנים, בסך הכל אתה יכול לעשות שאילתה יותר דינמית מאשר בשאילתא השניה. יתך מכך, עם נסיוני נוכחתי לדעת שבד"כ עדיף לעשות שאילתא מורכבת מאשר קוד צד שרת מורכב, לאמת יותר את המסד שאמור לדעת להתמודד עם שליפות כאלה באופן מהיר ויעיל מאשר שרת שישתמש בפונקציות רבות כדי להגיע לתוצאה די פשוטה.
לשיקולך, תמיד אפשר להחליף משאילתא לשרת ולהפך.


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

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