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

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

איציק ברבי 20-08-12 23:04

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

hour:minute 

אני רוצה למשל שהשעה 00:00 תהיה לפני 00:01
זאת הכוונה.

איך אני מבצע את זה? ORDER BY לא מועיל בקטע הזה.

------

העמודה הייתה בפורמט TEXT ולא בפורמט time
סידרתי את זה עם כמה דברים וזהו..

perfeito 20-08-12 23:28

למה לא להשתמש בפונקציה של mysql
()date

BuildDream 20-08-12 23:46

למה אתה לא מאחסן את הזמנים עם time() שמחזיר לך זמנים בint של שניות?
ככה אתה יכול למיין לפי זמנים (מספר גדול יותר = זמן מאוחר יותר)
וגם הצגה של הזמנים בכל פורמט שתרצה (אחרי השליפה להשתמש בפונקצייה date לקבלת איזה פורמט שתרצה).

איציק ברבי 21-08-12 02:51

אני מכיר את זה,
במקרה הזה אני צריך אותם ככה.

בניה 21-08-12 04:21

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

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

לחלופין: אם ממש לא אכפת לך מיעילות וזה איזה משהו חד פעמי אתה יכול בתוך השאילתה לפרק את הסטרינג למספר ולעשות את הORDER BY לפי זה אבל קח בחשבון שזה יהיה חייב לטייל על כל הטבלה

Daniel 21-08-12 07:02

כמו שכבר אמרו לך מה שלא תמצא - זה יהיה דיי לא יעיל. אבל אם אתה ממש צריך את זה - פתרון אפשרי (אך כמו שנאמר - לא יעיל בעליל):
תעשה:
PHP קוד:

ORDER BY LEFT(`time`, 2), RIGHT(`time`, 2

זה בעצם מסדר את זה בעדיפות ראשונה לפי השעה - ואם יש "תיקו" אז לפיהדקה. LEFT ו-RIGHT נותנים את התווים הכי ימניים והכי שמאליים בהתאמה.

איציק ברבי 21-08-12 14:35

ציטוט:

נכתב במקור על ידי Daniel (פרסם 855053)
כמו שכבר אמרו לך מה שלא תמצא - זה יהיה דיי לא יעיל. אבל אם אתה ממש צריך את זה - פתרון אפשרי (אך כמו שנאמר - לא יעיל בעליל):
תעשה:
PHP קוד:

ORDER BY LEFT(`time`, 2), RIGHT(`time`, 2

זה בעצם מסדר את זה בעדיפות ראשונה לפי השעה - ואם יש "תיקו" אז לפיהדקה. LEFT ו-RIGHT נותנים את התווים הכי ימניים והכי שמאליים בהתאמה.

נראה נחמד,
חידשתם לי דברים..

אדיר 21-08-12 14:41

למה לא להשתמש בשדה מהסוג המיועד לכך וזהו..?
https://dev.mysql.com/doc/refman/5.5...ime-types.html

איציק ברבי 21-08-12 14:43

אם היית קורא את הנושא כמו שצריך הייתי מבין שכבר עליתי על הפתרון.

שאלה נוספת -
יש לי ערך כזה
xx:xx:xxxx
אני רוצה לפצל את הxx:xx הראשונים סוג של explode אני מעוניין לבצע את זה דרך SQL.

בניה 21-08-12 15:00

הכל נמצא בתיעוד של MYSQL :-)

IgalSt 21-08-12 15:03

ציטוט:

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

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

כמו שרבים המליצו לך כבר, מאוד מומלץ להחזיק את הערך הזה בתא ייעודי: בין אם ע"י timestamp, שדה date time או אפילו עמודה ייעודית לשעה ועמודה ייעודית לתאריך.

איציק ברבי 21-08-12 15:16

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

אדיר 21-08-12 15:31

ציטוט:

נכתב במקור על ידי איציק ברבי (פרסם 855068)
אם היית קורא את הנושא כמו שצריך הייתי מבין שכבר עליתי על הפתרון.

שאלה נוספת -
יש לי ערך כזה
xx:xx:xxxx
אני רוצה לפצל את הxx:xx הראשונים סוג של explode אני מעוניין לבצע את זה דרך SQL.

קראתי את הנושא, הפתרון שהוצע לך לא מומלץ בכלל ולכן העלתי פתרון חלופי טוב יותר.

העובדה ש- "ככה זה" אצלך לא אומרת ש- "ככה זה" אמור להיות.
אתה עושה את זה בצורה לא נכונה וזאת גם אחת הסיבות שזה לא עובד לך כמו שצריך.
העובדה שהמידע מוצג בצורה מסויימת לא אומרת שככה הוא גם צריך להיות שמור במסד הנתונים.

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

תאמין לי שהשרת "יתעייף" הרבה יותר אם תעשה את זה כמו שאתה מתכנן לעשות את זה עכשיו מאשר אם תעשה את זה כמו שצריך לעשות את זה.

איציק ברבי 21-08-12 17:13

ציטוט:

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

העובדה ש- "ככה זה" אצלך לא אומרת ש- "ככה זה" אמור להיות.
אתה עושה את זה בצורה לא נכונה וזאת גם אחת הסיבות שזה לא עובד לך כמו שצריך.
העובדה שהמידע מוצג בצורה מסויימת לא אומרת שככה הוא גם צריך להיות שמור במסד הנתונים.

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

תאמין לי שהשרת "יתעייף" הרבה יותר אם תעשה את זה כמו שאתה מתכנן לעשות את זה עכשיו מאשר אם תעשה את זה כמו שצריך לעשות את זה.

אדיר, חבר,
הבעיה הראשונה נפתרה. תסתכל בהודעה הראשונה שלי(ערך השדה היה TEXT במקום TIME)
וסידרתי זה.
עכשיו אני בבעיה אחרת.
אני מאחסן נתונים בצורה כזאת: xx*xx*xx*xx
אני מעוניין להשוואות את הנתונים הכוונה בmysql_num_rows
אני לא רוצה להתעסק בהוצאה מהמסד וכ'ו..

אני רוצה לציין שלא מדובר בשעות\תאריכים אלא במידע פשוט.

IgalSt 21-08-12 17:28

ציטוט:

נכתב במקור על ידי איציק ברבי (פרסם 855081)
אדיר, חבר,
הבעיה הראשונה נפתרה. תסתכל בהודעה הראשונה שלי(ערך השדה היה TEXT במקום TIME)
וסידרתי זה.
עכשיו אני בבעיה אחרת.
אני מאחסן נתונים בצורה כזאת: xx*xx*xx*xx
אני מעוניין להשוואות את הנתונים הכוונה בmysql_num_rows
אני לא רוצה להתעסק בהוצאה מהמסד וכ'ו..

אני רוצה לציין שלא מדובר בשעות\תאריכים אלא במידע פשוט.

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

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

איציק ברבי 21-08-12 17:58

ציטוט:

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

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

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

GNS 21-08-12 18:11

תשתמש בSPLIT או SUBSTRING בתוך השאילתה שלך.. חפש בגוגל.

וגם אני ממליץ לך לסדר את הDB שלך.. הייתי כמוך עקשן ומתעלם מהערות עד שאתר אחד שלי נהיה גדול עם המון כניסות והתחיל להיות ממש ממש איטי, חשבתי שזה בעיה בשרת - עברתי לNGINX לא עזר - שידרגתי את השרת (היה כרוך באינטגרציות שבהם החזקתי 2 שרתים בו"ז) וגם לא עזר - בסוף הסתבר שהשאילתות שלי היו כל כך גרועות הDB חטף DEADLOCK על ימין ועל שמאל וזה תקע את האתר.

לא חוכמה ללמוד מטעויות שלך - החוכמה האמיתי היא ללמוד גם מטעויות של אחרים.
בהצלחה.

איציק ברבי 21-08-12 22:11

ציטוט:

נכתב במקור על ידי GNS (פרסם 855086)
תשתמש בSPLIT או SUBSTRING בתוך השאילתה שלך.. חפש בגוגל.

וגם אני ממליץ לך לסדר את הDB שלך.. הייתי כמוך עקשן ומתעלם מהערות עד שאתר אחד שלי נהיה גדול עם המון כניסות והתחיל להיות ממש ממש איטי, חשבתי שזה בעיה בשרת - עברתי לNGINX לא עזר - שידרגתי את השרת (היה כרוך באינטגרציות שבהם החזקתי 2 שרתים בו"ז) וגם לא עזר - בסוף הסתבר שהשאילתות שלי היו כל כך גרועות הDB חטף DEADLOCK על ימין ועל שמאל וזה תקע את האתר.

לא חוכמה ללמוד מטעויות שלך - החוכמה האמיתי היא ללמוד גם מטעויות של אחרים.
בהצלחה.

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

בניה 21-08-12 22:17

MYSQL String Functions
http://dev.mysql.com/doc/refman/5.0/...functions.html
SUBSTR() Return the substring as specified
SUBSTRING_INDEX() Return a substring from a string before the specified number of occurrences of the delimiter
SUBSTRING() Return the substring as specified

ועוד רבות אחרות

איציק ברבי 21-08-12 22:33

ציטוט:

נכתב במקור על ידי בניה (פרסם 855101)
MYSQL String Functions
http://dev.mysql.com/doc/refman/5.0/...functions.html
SUBSTR() Return the substring as specified
SUBSTRING_INDEX() Return a substring from a string before the specified number of occurrences of the delimiter
SUBSTRING() Return the substring as specified

ועוד רבות אחרות

תודה רבה, זה מה שהייתי צריך.


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

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