هل هناك طريقة في SQL (الخلية) إلى القيام ب "جولة روبن" ORDER BY على حقل معين؟
-
08-07-2019 - |
سؤال
هل هناك طريقة في SQL (الخلية) إلى القيام ب "جولة روبن" ORDER BY على حقل معين؟
وكمثال على ذلك، وأود أن تأخذ الجدول مثل هذا واحد:
+-------+------+
| group | name |
+-------+------+
| 1 | A |
| 1 | B |
| 1 | C |
| 2 | D |
| 2 | E |
| 2 | F |
| 3 | G |
| 3 | H |
| 3 | I |
+-------+------+
وتشغيل استعلام الذي يؤدي إلى نتائج في هذا النظام:
+-------+------+
| group | name |
+-------+------+
| 1 | A |
| 2 | D |
| 3 | G |
| 1 | B |
| 2 | E |
| 3 | H |
| 1 | C |
| 2 | F |
| 3 | I |
+-------+------+
لاحظ أن الجدول قد يكون العديد من الصفوف، لذلك لا أستطيع أن أفعل ترتيب في التطبيق. (كنت قد الواضح أن الشرط LIMIT كذلك في الاستعلام).
المحلول
ما يمكنك القيام به هو إنشاء عمود المؤقت الذي قمت إنشاء مجموعات لتعطيك شيئا من هذا القبيل:
+-------+------+-----+
| group | name | tmp |
+-------+------+-----+
| 1 | A | 1 |
| 1 | B | 2 |
| 1 | C | 3 |
| 2 | D | 1 |
| 2 | E | 2 |
| 2 | F | 3 |
| 3 | G | 1 |
| 3 | H | 2 |
| 3 | I | 3 |
+-------+------+-----+
لتعلم كيفية إنشاء مجموعات، وإلقاء نظرة على هذا السؤال / الإجابة .
وبعد ذلك لها بسيط
ORDER BY tmp, group, name
نصائح أخرى
وسوف أحاول شيئا مثل:
SET @counter = 0;
SELECT (@counter:=@counter+1)%3 as rr, grp, name FROM table ORDER by rr, grp
ويمكنك استخدام المتغيرات الخلية للقيام بذلك.
SELECT grp, name, @row:=@row+1 from table, (SELECT @row:=0) r ORDER BY (@row % 3);
+------+------+--------------+
| grp | name | @row:=@row+1 |
+------+------+--------------+
| 1 | A | 1 |
| 2 | D | 4 |
| 3 | G | 7 |
| 1 | B | 2 |
| 2 | E | 5 |
| 3 | H | 8 |
| 1 | C | 3 |
| 2 | F | 6 |
| 3 | I | 9 |
+------+------+--------------+
لا تنتمي إلى StackOverflow