Всем привет
столкнулся с проблемой сортировки выборки в MySQL. Почти весь день просидел, испробовал разные варианты, но нужного результата не добился. Возможно, кто-то подскажет правильное решение или просто еще один вариант "попробовать", потому что мне явно нужен свежий взгляд на проблему.
Итак, имеем таблицу MySQL (пожалуйста, смотрите вложение)
Имеем упрощенный до минимума
ЗАПРОС 1SELECT
order_id,
cost,
rd_id,
product_order_date
FROM report_data
GROUP BY WEEK(product_order_date)
Возвращает результат (
РЕЗУЛЬТАТ 1)
order_id | cost | rd_id | product_order_date |
88164 | 0 | 1 | 0000-00-00 00:00:00 |
143747 | 0 | 3 | 2011-07-18 11:40:42 |
149491 | 10.1 | 19 | 2011-07-25 04:27:24 |
151797 | 138 | 66 | 2011-08-02 14:45:06 |
152271 | 94.14 | 109 | 2011-08-08 15:49:20 |
155702 | 94.14 | 166 | 2011-08-17 06:00:03 |
теперь выполним
ЗАПРОС 2SELECT
order_id,
cost,
rd_id,
product_order_date
FROM report_data
вернет все строки (
РЕЗУЛЬТАТ 2)
order_id cost rd_id product_order_date
88164 0 1 0000-00-00 00:00:00
88165 0 2 0000-00-00 00:00:00
143747 0 3 2011-07-18 11:40:42
143751 0 4 2011-07-18 11:42:13
143753 0 5 2011-07-18 11:46:32
143809 0 6 2011-07-19 05:02:23
143813 0 7 2011-07-19 05:21:45
143815 0 8 2011-07-19 05:37:37
143823 0 9 2011-07-19 08:10:57
143825 0 10 2011-07-19 08:19:14
143827 0 11 2011-07-19 08:24:08
143829 0 12 2011-07-19 10:19:19
143831 0 13 2011-07-19 11:12:55
143834 93 14 2011-07-19 15:24:39
143836 426 15 2011-07-19 16:04:09
143849 33.48 16 2011-07-20 11:26:12
143855 81.66 17 2011-07-21 15:27:10
143855 130 18 2011-07-21 15:27:10
149491 10.1 19 2011-07-25 04:27:24
149491 0 20 2011-07-25 04:27:24
149494 11.08 21 2011-07-25 04:29:17
149504 456.48 22 2011-07-25 05:20:12
149504 0 23 2011-07-25 05:20:12
149504 0 24 2011-07-25 05:20:12
149508 0 25 2011-07-25 05:26:08
149678 89.4 26 2011-07-26 04:59:37
149678 0 27 2011-07-26 04:59:37
149681 89.4 28 2011-07-26 05:04:26
149694 46.44 29 2011-07-26 14:41:20
149694 55.92 30 2011-07-26 14:41:20
149694 59.4 31 2011-07-26 14:41:20
149694 89.4 32 2011-07-26 14:41:20
149864 55.92 33 2011-07-27 11:48:48
149864 63.72 34 2011-07-27 11:48:48
149864 33.48 35 2011-07-27 11:48:48
150868 138 36 2011-07-28 10:03:58
150870 117.96 37 2011-07-28 11:40:24
150870 55.92 38 2011-07-28 11:40:24
150873 117.96 39 2011-07-28 11:41:31
150894 10.76 40 2011-07-29 11:22:31
150894 15.8 41 2011-07-29 11:22:31
150894 17.96 42 2011-07-29 11:22:31
150894 15.8 43 2011-07-29 11:22:31
150894 125.04 44 2011-07-29 11:22:31
150894 15.8 45 2011-07-29 11:22:31
150894 173.4 46 2011-07-29 11:22:31
150894 10.76 47 2011-07-29 11:22:31
150943 66.96 48 2011-07-29 11:46:47
150943 64.56 49 2011-07-29 11:46:47
150943 414 50 2011-07-29 11:46:47
150957 117.96 51 2011-07-29 12:00:20
150957 33.48 52 2011-07-29 12:00:20
150957 64.56 53 2011-07-29 12:00:20
150961 138 54 2011-07-29 12:02:32
150961 63.72 55 2011-07-29 12:02:32
150961 64.56 56 2011-07-29 12:02:32
151076 46.44 57 2011-07-29 13:17:34
151076 228 58 2011-07-29 13:17:34
151076 94.8 59 2011-07-29 13:17:34
151076 194.88 60 2011-07-29 13:17:34
151076 99.14 61 2011-07-29 13:17:34
151076 55.94 62 2011-07-29 13:17:34
151103 33.24 63 2011-07-29 13:23:30
151103 136.2 64 2011-07-29 13:23:30
151103 51.81 65 2011-07-29 13:23:30
151797 138 66 2011-08-02 14:45:06
151797 284.1 67 2011-08-02 14:45:06
151797 46.44 68 2011-08-02 14:45:06
151813 100.08 69 2011-08-03 10:27:18
151815 120 70 2011-08-03 10:36:30
151826 94.14 71 2011-08-03 11:34:04
151826 97.44 72 2011-08-03 11:34:04
151829 117.96 73 2011-08-03 13:06:13
151829 138 74 2011-08-03 13:06:13
151829 93 75 2011-08-03 13:06:13
152210 120 76 2011-08-05 11:15:47
152212 46.44 77 2011-08-05 11:19:04
152214 60.24 78 2011-08-05 14:01:44
152216 46.44 79 2011-08-05 14:06:46
152218 117.96 80 2011-08-05 14:44:25
152220 63.72 81 2011-08-05 14:45:26
152222 117.96 82 2011-08-05 14:51:12
152224 63.72 83 2011-08-05 14:52:20
152226 42.54 84 2011-08-05 15:09:17
152228 63.72 85 2011-08-05 15:11:09
152228 42.54 86 2011-08-05 15:11:09
152231 98.28 87 2011-08-05 16:22:28
152231 42.54 88 2011-08-05 16:22:28
152234 138 89 2011-08-05 17:19:46
152236 63.72 90 2011-08-05 17:20:53
152236 42.54 91 2011-08-05 17:20:53
152236 99.12 92 2011-08-05 17:20:53
152236 138 93 2011-08-05 17:20:53
152241 42.54 94 2011-08-05 17:21:45
152241 99.12 95 2011-08-05 17:21:45
152244 138 96 2011-08-05 17:24:42
152246 42.54 97 2011-08-05 17:26:18
152246 99.12 98 2011-08-05 17:26:18
152246 138 99 2011-08-05 17:26:18
152246 63.72 100 2011-08-05 17:26:18
152251 42.54 101 2011-08-05 17:27:34
152251 297.36 102 2011-08-05 17:27:34
152254 85.08 103 2011-08-05 17:28:44
152254 63.72 104 2011-08-05 17:28:44
152257 42.54 105 2011-08-06 07:10:23
152257 46.44 106 2011-08-06 07:10:23
152260 42.54 107 2011-08-06 08:24:02
152260 46.44 108 2011-08-06 08:24:02
152271 94.14 109 2011-08-08 15:49:20
152271 125.04 110 2011-08-08 15:49:20
152271 152.16 111 2011-08-08 15:49:20
152275 375.12 112 2011-08-08 15:53:10
152275 152.16 113 2011-08-08 15:53:10
152275 188.28 114 2011-08-08 15:53:10
152318 60.24 115 2011-08-10 06:45:22
152320 120 116 2011-08-10 08:51:30
152322 14.14 117 2011-08-10 08:59:40
152324 14.14 118 2011-08-10 09:50:14
152326 25.85 119 2011-08-10 11:57:23
152326 60.24 120 2011-08-10 11:57:23
152326 25.85 121 2011-08-10 11:57:23
152326 97.44 122 2011-08-10 11:57:23
152326 27.29 123 2011-08-10 11:57:23
152326 132 124 2011-08-10 11:57:23
152326 27.29 125 2011-08-10 11:57:23
152326 25.85 126 2011-08-10 11:57:23
152326 31.68 127 2011-08-10 11:57:23
152336 25.85 128 2011-08-10 12:19:16
152336 31.68 129 2011-08-10 12:19:16
152336 25.85 130 2011-08-10 12:19:16
152336 25.85 131 2011-08-10 12:19:16
152336 27.29 132 2011-08-10 12:19:16
152336 27.29 133 2011-08-10 12:19:16
152348 12.92 134 2011-08-11 11:42:51
152348 240 135 2011-08-11 11:42:51
152348 12.92 136 2011-08-11 11:42:51
152348 353.88 137 2011-08-11 11:42:51
152348 12.92 138 2011-08-11 11:42:51
152348 77.54 139 2011-08-11 11:42:51
152348 12.92 140 2011-08-11 11:42:51
152348 12.92 141 2011-08-11 11:42:51
152348 12.92 142 2011-08-11 11:42:51
152358 77.54 143 2011-08-11 12:05:02
152358 12.92 144 2011-08-11 12:05:02
152358 12.92 145 2011-08-11 12:05:02
152358 12.92 146 2011-08-11 12:05:02
152358 12.92 147 2011-08-11 12:05:02
152358 12.92 148 2011-08-11 12:05:02
152358 12.92 149 2011-08-11 12:05:02
152366 12.92 150 2011-08-11 12:21:54
152366 12.92 151 2011-08-11 12:21:54
152366 12.92 152 2011-08-11 12:21:54
152366 12.92 153 2011-08-11 12:21:54
152366 12.92 154 2011-08-11 12:21:54
152366 77.54 155 2011-08-11 12:21:54
152366 12.92 156 2011-08-11 12:21:54
152387 0 157 2011-08-12 15:00:08
152389 0 158 2011-08-12 15:05:16
152391 0 159 2011-08-12 16:10:45
152393 0 160 2011-08-12 16:32:38
152395 0 161 2011-08-12 16:51:40
152397 0 162 2011-08-12 16:52:44
152399 60.24 163 2011-08-12 17:08:17
152399 0 164 2011-08-12 17:08:17
152399 0 165 2011-08-12 17:08:17
155702 94.14 166 2011-08-17 06:00:03
155704 117.96 167 2011-08-17 09:49:59
155704 94.14 168 2011-08-17 09:49:59
155707 94.14 169 2011-08-17 10:30:22
155707 218.94 170 2011-08-17 10:30:22
155710 218.94 171 2011-08-17 10:50:30
155710 94.14 172 2011-08-17 10:50:30
155723 94.14 173 2011-08-17 11:41:01
155723 63.72 174 2011-08-17 11:41:01
155726 63.72 175 2011-08-17 12:04:53
155728 63.72 176 2011-08-17 12:54:36
155732 0 177 2011-08-18 06:57:13
155732 0 178 2011-08-18 06:57:13
155735 0 179 2011-08-18 07:04:55
155737 0 180 2011-08-18 07:07:49
155739 0 181 2011-08-18 07:11:26
155739 0 182 2011-08-18 07:11:26
смотрим РЕЗУЛЬТАТ 2. Видим, что действительно в неделю с 8-08 п- 14-08 первая запись была сделана 2011-08-08 15:49:20 и имеет rd_id=109, а в неделю с 15-08 по 21-08 первая запись сделана 2011-08-17 06:00:03 и имеет rd_id=166.
Теперь сравним с РЕЗУЛЬТАТом 1 и увидим, что ЗАПРОС 1 отработал правильно
Теперь в ЗАПРОС 1 добавим одну строку и получим
ЗАПРОС 3SELECT
GROUP_CONCAT(order_id) AS ids,
rd_id,
order_id,
cost,
product_order_date
FROM report_data
GROUP BY WEEK(product_order_date)
вернет
РЕЗУЛЬТАТ 3ids | rd_id | order_id | cost | product_order_date |
88164,88165 | 1 | 88164 | 0 | 0000-00-00 00:00:00 |
143829,1438... | 12 | 143829 | 0 | 2011-07-19 10:19:19 |
150957,1509... | 52 | 150957 | 33.48 | 2011-07-29 12:00:20 |
152246,1522... | 97 | 152246 | 42.54 | 2011-08-05 17:26:18 |
152358,1523... | 146 | 152358 | 12.92 | 2011-08-11 12:05:02 |
155726,1557... | 175 | 155726 | 63.72 | 2011-08-17 12:04:53 |
Видим, что для предпоследней строки почему-то выбрана запись с rd_id=146 и датой 2011-08-11 12:05:02, а для последней строки запись rd_id=175 и датой 2011-08-17 12:04:53
Таким образом получается, что GROUP_CONCAT() изменяет порядок группы
по ссылке
http://lists.mysql.com/mysql/2664 прочел, что WEEK() не гарантирует выборку именно первой записи в группе. Но при этом, без GROUP_CONCAT() группировка правильная.
пробовал следующие запросы
ЗАПРОС 4SELECT
rd_id,
order_id,
cost,
product_order_date,
WEEK(product_order_date) AS _week
FROM report_data
GROUP BY _week
ЗАПРОС 5SELECT
GROUP_CONCAT(order_id) AS ids,
rd_id,
order_id,
cost,
product_order_date,
WEEK(product_order_date) AS _week
FROM report_data
GROUP BY _week
ЗАПРОС 4 возвращает результат, аналогичный РЕЗУЛЬТАТу 1, а ЗАПРОС 5 - аналогичный РЕЗУЛЬТАТу 3.
Заметил, что такой (баг?) наблюдается только при использовании функций дат в предложении группировки. Т.е замена WEEK() на DAY(), DAYOFYEAR(), MONTH() и другие функции даты не спасает - GROUP_CONCAT() изменяет порядок выборки
Пожалуйста, если кто знает решение проблемы или видит мою ошибку, подскажите.
Заранее спасибо