מציאת שורה שניה בMYSQL
-
יש לי טבלה גדולה, עם שלש עמודות (חוץ מID)
מספר טלפון, סכום, ותאריך
רשום שם כל התשלומים שלקוחות שלי שילמו.
אני צריך למצוא את התשלום השני של הלקוחות, זאת אומרת לצמצם את הרשימה לתשלום השני שכל לקוח ביצע.
על לקוח אחד הייתי עושה date DESC LIMIT 1, 1
אבל אני מחפש דרך לעשות את זה על כל הלקוחות.
יש רעיון, או צריך לתשאל על כל לקוח בנפרד עם PHP?
תודה -
@yossiz תודה עברתי על חלק מהתשובות, שהיו נראות מתאימות לבעייה שלי
אני חושב שהם משתמשים בWINDOW, שלא זמין בMYSQL 5.7
אגב, אתמול בערב בעקבות הפוסט שלך ניסיתי לשדרג לMYSQL 8 וישבתי על זה די הרבה זמן, אבל זה שיבש את כל המסדי נתונים והייתי צריך להעלות גיבוי.
לא בטוח שזה נכון לשדרג על שרת פועל. -
הפתרון הפרימטיבי שעולה לי בראש:
צריך לעשות שאילתה אחת שמחזירה את השורה הראשונה, כלומר הID המינימלי פר שורה:SELECT MIN(payment_id) FROM PaymentsTable
בעצם יש לנו את כל השורות הראשונות. ממילא יש לנו מקור איך להגיע לשורות השניות, ע"י פשוט שלילה של הראשונות וחיפוש הראשונות אחרי זה שוב.
זה אומר כזה דבר:SELECT MIN(payment_id) AS SECOND_PAY FROM PaymentsTable LEFT JOIN (SELECT MIN(payment_id) AS FIRST_ID FROM PaymentsTable) AS NEG_FIRST_ROWS WHERE NEG_FIRST_ROWS.FIRST_ID IS NULL
אז יש לנו פה את כל השניות.
שלב הבא זה JOIN בין השאילתה הזאת לטבלת התשלומים:SELECT Persons.*, Payments.* FROM Persons LEFT JOIN Payments ON Persons.ID = Payments.person_id INNER JOIN ( SELECT MIN(payment_id) AS SECOND_PAY_ID FROM PaymentsTable LEFT JOIN (SELECT MIN(payment_id) AS FIRST_ID FROM PaymentsTable) AS NEG_FIRST_ROWS WHERE NEG_FIRST_ROWS.FIRST_ID IS NULL) AS FILTER_SECONDS ON Payments.payment_id = FILTER_SECONDS.SECOND_PAY_ID
זה שאילתה כנראה נוראית מבחינת המחשב, שבעיקר ישאל את עצמו מה בדיוק הצורך ולמה אין תכנון טוב יותר.
-
@שואף אמר במציאת שורה שניה בMYSQL:
@yossiz תודה עברתי על חלק מהתשובות, שהיו נראות מתאימות לבעייה שלי
אני חושב שהם משתמשים בWINDOW, שלא זמין בMYSQL 5.7
אגב, אתמול בערב בעקבות הפוסט שלך ניסיתי לשדרג לMYSQL 8 וישבתי על זה די הרבה זמן, אבל זה שיבש את כל המסדי נתונים והייתי צריך להעלות גיבוי.
לא בטוח שזה נכון לשדרג על שרת פועל.אני שדרגתי על שרת פעיל וב"ה לא היו בעיות.
לקח כחמש דקות של השבתה..
https://tchumim.com/post/105902
אבל לא מנסים על הפעיל, אלא עשיתי תמונת מערכת, ויצרתי שרת חדש, עליו ניסיתי, וכמה וכמה פעמים נכשל, עד שהגעתי לדרך הנכון, ואז נכנסתי לחומת האש של אמזון, עצרתי את פורט 80 ו443 וכו' שלא יהיו תעבורה נכנסת לביצוע שינויים, וכמובן עשיתי גיבוי סופי נוסף, ואז ביצעצי את העדכון לקח כמה דקות ושחררתי את התכבורה הנכנסת.
הפונקציות החדשות בגרסה 8 באים בהחלט לשימוש. -
@שואף אמר במציאת שורה שניה בMYSQL:
@dovid חשבתי לעשות משהו מסובך בסגנון כזה.
השאלה אם לא עדיף כבר לעשות את זה ישירות בPHP.זה עושה בדיוק את אותו דבר.
אתה גם לא אמרת בכלל למה אתה צריך ומה אתה צריך,
כי יכול להיות שאפשר לעשות משהו פשוט בהרבה.
זרקת שאלה זרקתי לך תשובה. האם בPHP יותר טוב? לא, פחות טוב.