כשיש לנו יחס של Many To Many בין טבלאות בבסיס הנתונים, יהיה מועיל הרבה פעמים לחבר את כל הנתונים מטבלא אחת למחרוזת ארוכה שתתאים לפריט בודד מהטבלא השניה. ניקח לדוגמא מערכת בלוג ונניח שכל פוסט מתויג לפי תווית אחת או יותר, ונרצה לשלוף את כל הפוסטים ולכל פוסט את רשימת כל התוויות שלו.
הטבלאות במערכת יהיו:
טבלת posts עם פרטי הפוסט ושדה id.
טבלת labels עם שם התווית (אותו נרצה לחבר לשאילתה) ושדה id.
טבלת label_posts
היא טבלת החיבור שכוללת את השדות label_id
ו post_id
.
השאילתה הבאה מחזירה שורה לכל פוסט במערכת, והשדה labels של השאילתה מחזיק את כל התוויות כמחרוזת (מופרדות בפסיקים):
SELECT posts.id, posts.header, Group_Concat(labels.name) AS labels
FROM posts, label_posts, labels
ON posts.id = label_posts.post_id and labels.id = label_posts.label_id
GROUP by posts.id;
התוצאה על טבלת דוגמא שיצרתי נראית כך:
id|header|labels
1|one|event,work
2|two|tv
נ.ב. הפקודה Group_Concat
ייחודית ל SQLite. בבסיסי נתונים אחרים יש פקודות מקבילות לדוגמא ב Postgresql וב SQL Server הפקודה היא STRING_AGG
. אם אתם בעניין של SQL Server יש די הרבה תיעוד עליה ועוד דוגמאות בקישור הזה.