Появляются дубли при RAND() сортировке

Приветствую.
При использовании pdoPage и msProducts появляются дубли в выдаче, если сортировать RAND().
Если выводить с сортировкой ASC или DESC — то все ок, дублей нет.
Если выводить без пагинации, напрямую msProducts: все ок.
Если задать &limit=`0` — все ок.
Если задать limit больше `0` — появляются дубли.
Кол-во дублей не зависит от кол-ва страниц, указанных в limit (что 2 страницы по 100 записей, что 20 страниц по 10 записей — кол-во дублей в обоих случаях одинаково)

В выдаче количество дублей и их ид — не всегда одинаковые, при этом общее количество товаров остается неизменным, а дубли заменяют собой другие ид.

Например:
без RAND(): .....6455, 6456, 6457… (общее кол-во элементов в категории при выводе — 150)
с RAND(): .....6455, 6455, 6457… (общее кол-во элементов в категории при выводе — 150)

Сравнивал все элементы в базе — никаких отличий нет, кроме даты создания, алиаса, ид, парента и тайтла.

вызов такой:

[[!pdoPage?
	&element=`msProducts`
	&parents=`[[*id]]`
	&limit=`24`
	&pageLimit=`10`
	&tpl=`@INLINE [[+id]]<br />`
	&sortdir=`DESC`
	&cache=`1`
	&cacheTime=`2600000`
	&cache_user=`1`
	&includeTVs=``
	&showHidden=`1`
	&setMeta=`0`
	&scheme=`uri`
	&groupby=`id`
	&sortby=`RAND()`
	&fastMode=`1`
]]

[[!+page.nav]]

miniShop 2.2.0-pl2
pdoTools 2.4.0-pl
php7 / modhost
Constantine
10 июля 2016, 15:42
modx.pro
2 459
0

Комментарии: 14

Constantine
11 июля 2016, 19:36
0
ап
    Владимир Кисилица
    11 июля 2016, 20:15
    0
    Попробуй
    &groupby=`msProduct.id`
      Constantine
      11 июля 2016, 20:24
      0
      ничего не выводит
        Владимир Кисилица
        12 июля 2016, 09:42
        0
        Логи покажите
          Constantine
          12 июля 2016, 09:54
          0
          странно, а теперь выводится, так же с дублями. при этом я ничего не менял. лог с &groupby=`msProduct.id`

          0.0000172: xPDO query object created
          0.0000792: leftJoined msProductData as Data
          0.0000522: leftJoined msVendor as Vendor
          0.0000012: Grouped by msProduct.id
          0.0000310: Added selection of msProduct: SQL_CALC_FOUND_ROWS `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
          0.0000091: Added selection of msProductData: `article`, `price`, `old_price`, `weight`, `image`, `thumb`, `vendor`, `made_in`, `new`, `popular`, `favorite`, `tags`, `color`, `size`, `source`
          0.0000081: Added selection of msVendor: `name` AS `vendor.name`, `resource` AS `vendor.resource`, `country` AS `vendor.country`, `logo` AS `vendor.logo`, `address` AS `vendor.address`, `phone` AS `vendor.phone`, `fax` AS `vendor.fax`, `email` AS `vendor.email`, `description` AS `vendor.description`, `properties` AS `vendor.properties`
          0.0008419: Processed additional conditions
          0.0009511: Added where condition: class_key=msProduct, msProduct.parent:IN(5565,5709,5569,5710,5571,5570,5572,5694,5695,5717,5724,5725,5921,5922,5696,6392,6393,5698,6394,6395,6396,6397,6398,6399,6400,5705,6401,6414,6436,6438,6454,6457,6461,6464,6465,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5924,5688,5692,5693,5711,5719,5720,5723,6351,6387,6427,6451,6456,5701,6466,5707,5708,5687,5689,5690,5691,5686,5697,5699,5700,5712,5713,5714,5715,5702,5703,5716,5704,5718,5721,5726,5706,5727,5728,5923,6339,6340,6341,6346,6347,6348,6349,6350,6353,6356,6357,6358,6359,6360,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6377,6378,6379,6380,6382,6383,6384,6385,6386,6388,6389,6391,6403,6404,6405,6407,6408,6409,6410,6411,6412,6413,6415,6419,6420,6421,6423,6424,6429,6430,6431,6432,6439,6440,6441,6442,6443,6462,6469,6470,6471,6472,6437,5661,5662,5663,5664,5665,5666,5667,6426,6446,5660,6447,6463,6468,5651,5652,5653,5654,5655,5656,5657,5658,5659,5722,6422,6425,6428,6433,6434,6452,6453,6455,6458,5650), msProduct.published=1, msProduct.deleted=0
          0.0000222: Sorted by RAND(), DESC
          0.0000010: Limited to 100, offset 0
          0.0001721: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `msProduct`.`id`, `msProduct`.`type`, `msProduct`.`contentType`, `msProduct`.`pagetitle`, `msProduct`.`longtitle`, `msProduct`.`description`, `msProduct`.`alias`, `msProduct`.`link_attributes`, `msProduct`.`published`, `msProduct`.`pub_date`, `msProduct`.`unpub_date`, `msProduct`.`parent`, `msProduct`.`isfolder`, `msProduct`.`introtext`, `msProduct`.`richtext`, `msProduct`.`template`, `msProduct`.`menuindex`, `msProduct`.`searchable`, `msProduct`.`cacheable`, `msProduct`.`createdby`, `msProduct`.`createdon`, `msProduct`.`editedby`, `msProduct`.`editedon`, `msProduct`.`deleted`, `msProduct`.`deletedon`, `msProduct`.`deletedby`, `msProduct`.`publishedon`, `msProduct`.`publishedby`, `msProduct`.`menutitle`, `msProduct`.`donthit`, `msProduct`.`privateweb`, `msProduct`.`privatemgr`, `msProduct`.`content_dispo`, `msProduct`.`hidemenu`, `msProduct`.`class_key`, `msProduct`.`context_key`, `msProduct`.`content_type`, `msProduct`.`uri`, `msProduct`.`uri_override`, `msProduct`.`hide_children_in_tree`, `msProduct`.`show_in_tree`, `msProduct`.`properties`, `Data`.`article`, `Data`.`price`, `Data`.`old_price`, `Data`.`weight`, `Data`.`image`, `Data`.`thumb`, `Data`.`vendor`, `Data`.`made_in`, `Data`.`new`, `Data`.`popular`, `Data`.`favorite`, `Data`.`tags`, `Data`.`color`, `Data`.`size`, `Data`.`source`, `Vendor`.`name` AS `vendor.name`, `Vendor`.`resource` AS `vendor.resource`, `Vendor`.`country` AS `vendor.country`, `Vendor`.`logo` AS `vendor.logo`, `Vendor`.`address` AS `vendor.address`, `Vendor`.`phone` AS `vendor.phone`, `Vendor`.`fax` AS `vendor.fax`, `Vendor`.`email` AS `vendor.email`, `Vendor`.`description` AS `vendor.description`, `Vendor`.`properties` AS `vendor.properties` FROM `modx_site_content` AS `msProduct` LEFT JOIN `modx_ms2_products` `Data` ON `msProduct`.`id`=`Data`.`id` LEFT JOIN `modx_ms2_vendors` `Vendor` ON `Data`.`vendor`=`Vendor`.`id` WHERE  ( `msProduct`.`class_key` = 'msProduct' AND `msProduct`.`parent` IN (5565,5709,5569,5710,5571,5570,5572,5694,5695,5717,5724,5725,5921,5922,5696,6392,6393,5698,6394,6395,6396,6397,6398,6399,6400,5705,6401,6414,6436,6438,6454,6457,6461,6464,6465,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5924,5688,5692,5693,5711,5719,5720,5723,6351,6387,6427,6451,6456,5701,6466,5707,5708,5687,5689,5690,5691,5686,5697,5699,5700,5712,5713,5714,5715,5702,5703,5716,5704,5718,5721,5726,5706,5727,5728,5923,6339,6340,6341,6346,6347,6348,6349,6350,6353,6356,6357,6358,6359,6360,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6377,6378,6379,6380,6382,6383,6384,6385,6386,6388,6389,6391,6403,6404,6405,6407,6408,6409,6410,6411,6412,6413,6415,6419,6420,6421,6423,6424,6429,6430,6431,6432,6439,6440,6441,6442,6443,6462,6469,6470,6471,6472,6437,5661,5662,5663,5664,5665,5666,5667,6426,6446,5660,6447,6463,6468,5651,5652,5653,5654,5655,5656,5657,5658,5659,5722,6422,6425,6428,6433,6434,6452,6453,6455,6458,5650) AND `msProduct`.`published` = 1 AND `msProduct`.`deleted` = 0 )  GROUP BY msProduct.id ORDER BY RAND() DESC LIMIT 100 "
          0.0081558: SQL executed
          0.0000679: Total rows: 197
          0.0003889: Rows fetched
          0.0002971: Returning raw data
          0.0002720: Checked the active modifiers
          0.0035369: Created inline chunk with name "d33cd0443568ecac4cea2964ef6ec913"
          0.0660379: Loaded options for products
          0.0000060: Returning processed chunks
          0.1820130: Total time
          6 291 456: Memory usage

          вот с просто groupby=`id`

          0.0000291: xPDO query object created
          0.0001280: leftJoined msProductData as Data
          0.0000989: leftJoined msVendor as Vendor
          0.0000019: Grouped by id
          0.0000510: Added selection of msProduct: SQL_CALC_FOUND_ROWS `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
          0.0000160: Added selection of msProductData: `article`, `price`, `old_price`, `weight`, `image`, `thumb`, `vendor`, `made_in`, `new`, `popular`, `favorite`, `tags`, `color`, `size`, `source`
          0.0000150: Added selection of msVendor: `name` AS `vendor.name`, `resource` AS `vendor.resource`, `country` AS `vendor.country`, `logo` AS `vendor.logo`, `address` AS `vendor.address`, `phone` AS `vendor.phone`, `fax` AS `vendor.fax`, `email` AS `vendor.email`, `description` AS `vendor.description`, `properties` AS `vendor.properties`
          0.0020559: Processed additional conditions
          0.0022612: Added where condition: class_key=msProduct, msProduct.parent:IN(5565,5709,5569,5710,5571,5570,5572,5694,5695,5717,5724,5725,5921,5922,5696,6392,6393,5698,6394,6395,6396,6397,6398,6399,6400,5705,6401,6414,6436,6438,6454,6457,6461,6464,6465,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5924,5688,5692,5693,5711,5719,5720,5723,6351,6387,6427,6451,6456,5701,6466,5707,5708,5687,5689,5690,5691,5686,5697,5699,5700,5712,5713,5714,5715,5702,5703,5716,5704,5718,5721,5726,5706,5727,5728,5923,6339,6340,6341,6346,6347,6348,6349,6350,6353,6356,6357,6358,6359,6360,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6377,6378,6379,6380,6382,6383,6384,6385,6386,6388,6389,6391,6403,6404,6405,6407,6408,6409,6410,6411,6412,6413,6415,6419,6420,6421,6423,6424,6429,6430,6431,6432,6439,6440,6441,6442,6443,6462,6469,6470,6471,6472,6437,5661,5662,5663,5664,5665,5666,5667,6426,6446,5660,6447,6463,6468,5651,5652,5653,5654,5655,5656,5657,5658,5659,5722,6422,6425,6428,6433,6434,6452,6453,6455,6458,5650), msProduct.published=1, msProduct.deleted=0
          0.0000389: Sorted by RAND(), DESC
          0.0000029: Limited to 100, offset 0
          0.0003200: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `msProduct`.`id`, `msProduct`.`type`, `msProduct`.`contentType`, `msProduct`.`pagetitle`, `msProduct`.`longtitle`, `msProduct`.`description`, `msProduct`.`alias`, `msProduct`.`link_attributes`, `msProduct`.`published`, `msProduct`.`pub_date`, `msProduct`.`unpub_date`, `msProduct`.`parent`, `msProduct`.`isfolder`, `msProduct`.`introtext`, `msProduct`.`richtext`, `msProduct`.`template`, `msProduct`.`menuindex`, `msProduct`.`searchable`, `msProduct`.`cacheable`, `msProduct`.`createdby`, `msProduct`.`createdon`, `msProduct`.`editedby`, `msProduct`.`editedon`, `msProduct`.`deleted`, `msProduct`.`deletedon`, `msProduct`.`deletedby`, `msProduct`.`publishedon`, `msProduct`.`publishedby`, `msProduct`.`menutitle`, `msProduct`.`donthit`, `msProduct`.`privateweb`, `msProduct`.`privatemgr`, `msProduct`.`content_dispo`, `msProduct`.`hidemenu`, `msProduct`.`class_key`, `msProduct`.`context_key`, `msProduct`.`content_type`, `msProduct`.`uri`, `msProduct`.`uri_override`, `msProduct`.`hide_children_in_tree`, `msProduct`.`show_in_tree`, `msProduct`.`properties`, `Data`.`article`, `Data`.`price`, `Data`.`old_price`, `Data`.`weight`, `Data`.`image`, `Data`.`thumb`, `Data`.`vendor`, `Data`.`made_in`, `Data`.`new`, `Data`.`popular`, `Data`.`favorite`, `Data`.`tags`, `Data`.`color`, `Data`.`size`, `Data`.`source`, `Vendor`.`name` AS `vendor.name`, `Vendor`.`resource` AS `vendor.resource`, `Vendor`.`country` AS `vendor.country`, `Vendor`.`logo` AS `vendor.logo`, `Vendor`.`address` AS `vendor.address`, `Vendor`.`phone` AS `vendor.phone`, `Vendor`.`fax` AS `vendor.fax`, `Vendor`.`email` AS `vendor.email`, `Vendor`.`description` AS `vendor.description`, `Vendor`.`properties` AS `vendor.properties` FROM `modx_site_content` AS `msProduct` LEFT JOIN `modx_ms2_products` `Data` ON `msProduct`.`id`=`Data`.`id` LEFT JOIN `modx_ms2_vendors` `Vendor` ON `Data`.`vendor`=`Vendor`.`id` WHERE  ( `msProduct`.`class_key` = 'msProduct' AND `msProduct`.`parent` IN (5565,5709,5569,5710,5571,5570,5572,5694,5695,5717,5724,5725,5921,5922,5696,6392,6393,5698,6394,6395,6396,6397,6398,6399,6400,5705,6401,6414,6436,6438,6454,6457,6461,6464,6465,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5924,5688,5692,5693,5711,5719,5720,5723,6351,6387,6427,6451,6456,5701,6466,5707,5708,5687,5689,5690,5691,5686,5697,5699,5700,5712,5713,5714,5715,5702,5703,5716,5704,5718,5721,5726,5706,5727,5728,5923,6339,6340,6341,6346,6347,6348,6349,6350,6353,6356,6357,6358,6359,6360,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6377,6378,6379,6380,6382,6383,6384,6385,6386,6388,6389,6391,6403,6404,6405,6407,6408,6409,6410,6411,6412,6413,6415,6419,6420,6421,6423,6424,6429,6430,6431,6432,6439,6440,6441,6442,6443,6462,6469,6470,6471,6472,6437,5661,5662,5663,5664,5665,5666,5667,6426,6446,5660,6447,6463,6468,5651,5652,5653,5654,5655,5656,5657,5658,5659,5722,6422,6425,6428,6433,6434,6452,6453,6455,6458,5650) AND `msProduct`.`published` = 1 AND `msProduct`.`deleted` = 0 )  GROUP BY id ORDER BY RAND() DESC LIMIT 100 "
          0.0092502: SQL executed
          0.0001199: Total rows: 197
          0.0006421: Rows fetched
          0.0003881: Returning raw data
          0.0002890: Checked the active modifiers
          0.0041649: Created inline chunk with name "d33cd0443568ecac4cea2964ef6ec913"
          0.1054816: Loaded options for products
          0.0000072: Returning processed chunks
          0.2756269: Total time
          10 485 760: Memory usage
      Constantine
      13 июля 2016, 10:08
      0
      воспроизвел эту же ошибку на тестовом хостинге.
      абсолютно идентичные ошибки с дубликатами

      s5972.h2.modhost.pro/manager/
      s5972
      9DWqi0qYahV0

      если это ошибка, то куда и как сообщить об этом?
        Василий Наумкин
        13 июля 2016, 10:33
        0
        Друг, попробуй подумать головой.

        Если ты ставишь случайную сортировку, то товары выводятся случайно. А это значит, что позиции на каждой странице могут повторять позиции на предыдущих и следующих, потому что они каждый раз тасуются заново.

        1 страница — ты говоришь вывести 10 товаров в случайном порядке, начиная с нуля.
        2 страница — ты говоришь вывести 10 товаров в случайном порядке, начиная с 10го.
        3 страница — ты говоришь вывести 10 товаров в случайном порядке, начиная с 20го.

        Вот они каждый раз и выводятся случайно, с пропуском n случайных товаров, в зависимости от номера страницы. Более того, если просто обновлять страницу с пагинацией, то вывод тоже каждый раз будет меняться.

        Неужели до этого нельзя было дойти самостоятельно?
          Constantine
          13 июля 2016, 10:38
          0
          тогда понятно
          я думал, что, сначала обрабатывается весь вывод и уже потом сортируется по страницам с соответствующим отступом

          как тогда можно реализовать пагинацию и случайную сортировку?
            Василий Наумкин
            13 июля 2016, 10:41
            0
            сначала обрабатывается весь вывод
            И зачем тогда вообще пагинация? Она как раз нужна, чтобы не выбирать сразу все позиции и не напрягать сервер лишний раз.

            как тогда можно реализовать пагинацию и случайную сортировку?
            Выбрать самому все id товаров, перемешать функцией rand() и передать в pdoPage
            [[!pdoPage?
            	&parents=`0`
            	&resources=`[[твойсниппет]]`
            	&sortby=`ids`
            ]]
            Ну и убедиться, чтобы [[твойсниппет]] не выдавал каждый раз новые значения, а кэшировал их для текущего юзера.
            То есть, ты как-бы сам указываешь свой «случайный» порядок при вызове сниппета — других вариантов не вижу.
              Constantine
              13 июля 2016, 10:44
              0
              благодарю
                Малахов Владимир
                19 ноября 2018, 11:19
                0
                Василий, у меня абсолютно та же проблема, но сложность в том, что это мои первые шаги в освоении MODX и я даже примерно не представляю, что должно быть внутри этого сниппета.
                Не могли бы Вы привести простейший пример?
                Пока мой код такой:
                <div id="pdopage">
                            [[!+page.nav]]
                            <div class="rows">
                [[!pdoPage?
                  &parents=`0`
                  &ajaxMode=`scroll`
                  &tpl=`items.row`
                  &includeTVs=`about,status,basic,more,index`
                  &where=`["UNIX_TIMESTAMP(index) > UNIX_TIMESTAMP()"]`
                  &sortby=`RAND()`
                  ]]
                И ещё, я не уверен, что Вы прочтёте моё сообщение, ибо теме уже более 2 лет.
                Ответьте, пожалуйста, хотя бы одной фразой о прочтении.
                  Василий Наумкин
                  19 ноября 2018, 11:25
                  0
                  Прочёл, но сниппет я писать не буду.

                  Тут неважно, MODX или нет — логика для любой программы одинакова.
                    Малахов Владимир
                    20 ноября 2018, 08:15
                    0
                    А если сначала сохранить всю выборку в плейсхолдер
                    [[!pdoResources?
                      &parents=`0`
                      &includeTVs=`about,status,basic,more,index`
                      &where=`["UNIX_TIMESTAMP(index) > UNIX_TIMESTAMP()"]`
                      &sortby=`RAND()`
                      &toPlaceholder=`sortedList`
                      ]]
                    а потом выводить в pdoPage
                    [[!pdoPage?
                      &parents=`0`
                      &ajaxMode=`scroll`
                      &tpl=`items.row`
                      &resources=`[[+sortedList]]`
                      ]]
                    И не работает. Или так не получится?
                      Малахов Владимир
                      20 ноября 2018, 19:05
                      0
                      Проверил содержание плейсхолдера. В наличии имеем:
                      [sortedList] => 
                      
                      Array
                      (
                      [id] => 492
                      [type] => document
                      [contentType] => text/html
                      // тут еще штук 30 строк
                      [tv.about] => текст о компании
                      [tv.basic] => 106
                      [tv.more] => 112
                      )    
                      Array
                      (
                      [id] => 431
                      // аналогично с первым массивом
                      )
                      Array
                      (
                      [id] => 511
                      // аналогично с первым массивом
                      )
                      Array // и так далее...
                      Получается, плейсхолдер сортируется и пишется нормально.
                      Почему pdoPage не принимает плейсхолдер, созданный родным братом?
                      В каком виде должны быть данные в плейсхолдере для pdoPage?
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          14