Появляются дубли при 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)
Сравнивал все элементы в базе — никаких отличий нет, кроме даты создания, алиаса, ид, парента и тайтла.
вызов такой:
miniShop 2.2.0-pl2
pdoTools 2.4.0-pl
php7 / modhost
При использовании 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
Комментарии: 14
ап
Попробуй
&groupby=`msProduct.id`
ничего не выводит
Логи покажите
странно, а теперь выводится, так же с дублями. при этом я ничего не менял. лог с &groupby=`msProduct.id`
вот с просто groupby=`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
воспроизвел эту же ошибку на тестовом хостинге.
абсолютно идентичные ошибки с дубликатами
s5972.h2.modhost.pro/manager/
s5972
9DWqi0qYahV0
если это ошибка, то куда и как сообщить об этом?
абсолютно идентичные ошибки с дубликатами
s5972.h2.modhost.pro/manager/
s5972
9DWqi0qYahV0
если это ошибка, то куда и как сообщить об этом?
Друг, попробуй подумать головой.
Если ты ставишь случайную сортировку, то товары выводятся случайно. А это значит, что позиции на каждой странице могут повторять позиции на предыдущих и следующих, потому что они каждый раз тасуются заново.
1 страница — ты говоришь вывести 10 товаров в случайном порядке, начиная с нуля.
2 страница — ты говоришь вывести 10 товаров в случайном порядке, начиная с 10го.
3 страница — ты говоришь вывести 10 товаров в случайном порядке, начиная с 20го.
Вот они каждый раз и выводятся случайно, с пропуском n случайных товаров, в зависимости от номера страницы. Более того, если просто обновлять страницу с пагинацией, то вывод тоже каждый раз будет меняться.
Неужели до этого нельзя было дойти самостоятельно?
Если ты ставишь случайную сортировку, то товары выводятся случайно. А это значит, что позиции на каждой странице могут повторять позиции на предыдущих и следующих, потому что они каждый раз тасуются заново.
1 страница — ты говоришь вывести 10 товаров в случайном порядке, начиная с нуля.
2 страница — ты говоришь вывести 10 товаров в случайном порядке, начиная с 10го.
3 страница — ты говоришь вывести 10 товаров в случайном порядке, начиная с 20го.
Вот они каждый раз и выводятся случайно, с пропуском n случайных товаров, в зависимости от номера страницы. Более того, если просто обновлять страницу с пагинацией, то вывод тоже каждый раз будет меняться.
Неужели до этого нельзя было дойти самостоятельно?
тогда понятно
я думал, что, сначала обрабатывается весь вывод и уже потом сортируется по страницам с соответствующим отступом
как тогда можно реализовать пагинацию и случайную сортировку?
я думал, что, сначала обрабатывается весь вывод и уже потом сортируется по страницам с соответствующим отступом
как тогда можно реализовать пагинацию и случайную сортировку?
сначала обрабатывается весь выводИ зачем тогда вообще пагинация? Она как раз нужна, чтобы не выбирать сразу все позиции и не напрягать сервер лишний раз.
как тогда можно реализовать пагинацию и случайную сортировку?Выбрать самому все id товаров, перемешать функцией rand() и передать в pdoPage
[[!pdoPage?
&parents=`0`
&resources=`[[твойсниппет]]`
&sortby=`ids`
]]
Ну и убедиться, чтобы [[твойсниппет]] не выдавал каждый раз новые значения, а кэшировал их для текущего юзера.То есть, ты как-бы сам указываешь свой «случайный» порядок при вызове сниппета — других вариантов не вижу.
благодарю
Василий, у меня абсолютно та же проблема, но сложность в том, что это мои первые шаги в освоении 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 лет.Ответьте, пожалуйста, хотя бы одной фразой о прочтении.
Прочёл, но сниппет я писать не буду.
Тут неважно, MODX или нет — логика для любой программы одинакова.
Тут неважно, MODX или нет — логика для любой программы одинакова.
А если сначала сохранить всю выборку в плейсхолдер
[[!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]]`
]]
И не работает. Или так не получится?
Проверил содержание плейсхолдера. В наличии имеем:
Почему pdoPage не принимает плейсхолдер, созданный родным братом?
В каком виде должны быть данные в плейсхолдере для pdoPage?
[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?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.