Вот есть у меня в лк вкладка со списком публикаций (я ее делал на основе другого плагина). В ней можно сортировать записи по дате добавления.
Ссылка -
Если меняю на asc, то сперва показываются старые. Т.е. вроде работает сортировка.
Ну я говорю про сортировку с подзапросом. Просто сортировка работает это мы проверяли.
$get_a = $wpdb->get_results("" . "SELECT " . RCL_PREF . "achievement.*, tmp.date " . "FROM (" . "SELECT * FROM " . RCL_PREF . "achievement_stats " . "WHERE user_id = $user_id ORDER BY date DESC, ID DESC) as tmp " . "INNER JOIN " . RCL_PREF . "achievement ON tmp.achiev_id = " . RCL_PREF . "achievement.ID " . "GROUP BY type " . "ORDER BY tmp.date DESC " . "LIMIT $limit", ARRAY_A);
Вот тут внутри подзапрос который получает все ачивки юзера и сортирует их по дате и по ID если дата одинаковая. Затем пишет это во временную таблицу и уже в ней группирует по типу. У вас почему то либо сортировка сбрасывается после подзапроса, либо группировка выбирает не 1ое найденное значение, как должна, а последнее. Я подумаю как можно решить проблему, пока хз
профит есть от mariaDB? Реально снижает нагрузку и работает быстрей?
И еще интересует - с другими плагинами вы сталкивались - что работать отказывается и как часто?
Уже весьма давно сижу на MariaDB, так как она идет по дефолту на CentOS. Перечитал много сравнений - большинство мнений за марию.
За все время ни разу не сталкивался с проблемами
Попробуйте весь запрос с 416 строки заменить на:
$get_a = $wpdb->get_results("" . "SELECT " . RCL_PREF . "achievement.*, tmp.date " . "FROM (" . "SELECT achiev_id, date FROM " . RCL_PREF . "achievement_stats " . "WHERE user_id = $user_id ORDER BY date DESC, ID DESC) as tmp " . "INNER JOIN " . RCL_PREF . "achievement ON tmp.achiev_id = " . RCL_PREF . "achievement.ID " . "GROUP BY type " . "ORDER BY tmp.date DESC " . "LIMIT $limit", ARRAY_A);
А на такой если:
$get_a = $wpdb->get_results("" . "SELECT " . RCL_PREF . "achievement.*, tmp.date " . "FROM (" . "SELECT achiev_id, date FROM " . RCL_PREF . "achievement_stats " . "WHERE user_id = $user_id ORDER BY date DESC, ID DESC) as tmp " . "JOIN " . RCL_PREF . "achievement ON tmp.achiev_id = " . RCL_PREF . "achievement.ID " . "GROUP BY " . RCL_PREF . "achievement.type " . "ORDER BY tmp.date DESC " . "LIMIT $limit", ARRAY_A);
А так:
$get_a = $wpdb->get_results("" . "SELECT " . RCL_PREF . "achievement.*, tmp.date " . "FROM (" . "SELECT achiev_id, date, ID as stats_ID FROM " . RCL_PREF . "achievement_stats " . "WHERE user_id = $user_id ORDER BY date DESC, ID DESC) as tmp " . "INNER JOIN " . RCL_PREF . "achievement ON tmp.achiev_id = " . RCL_PREF . "achievement.ID " . "GROUP BY " . RCL_PREF . "achievement.type " . "ORDER BY tmp.date DESC, tmp.stats_ID DESC " . "LIMIT $limit", ARRAY_A);
Так еще:
$get_a = $wpdb->get_results("" . "SELECT " . RCL_PREF . "achievement.*, tmp.date " . "FROM (" . "SELECT achiev_id, date, ID as stats_ID, user_id FROM " . RCL_PREF . "achievement_stats " . "WHERE user_id = $user_id ORDER BY date DESC, stats_ID DESC) as tmp " . "INNER JOIN " . RCL_PREF . "achievement ON tmp.achiev_id = " . RCL_PREF . "achievement.ID " . "GROUP BY " . RCL_PREF . "achievement.type " . "ORDER BY tmp.date DESC, tmp.stats_ID DESC " . "LIMIT $limit", ARRAY_A);
Я честно хз что этой mariadb не нравится. Попробую позже разделить на несколько запросов.
У вас база почему то после того как получила во временную таблицу tmp список ачивок упорядоченный по дате и ID, сбрасывает сортировку и при выполнении GROUP BY берет не первый результат с типом ачивки, а последний. Может конечно в запросе где ошибка, яв таких тонкостях не разбираюсь.
Kerncraft1 сказал(а)
Я уточнить на всякий хочу один момент. Мы же меняем условия запроса только в секции if? Или нужно и секцию else убирать?
Скрин того что меняю -Вы не можете просматривать опубликованные ссылки
Да все правильно делаете, после else это запрос если не включена группировка по типу
Kerncraft1 сказал(а)
Ок. буду ждать. Кстати - есть пустой сервак не нужный пока. На нем как раз тоже maria стоит. Могу дать доступ, чтобы потестили как вам удобнее. На серваке панелька isp 5, так что добавить тестовый сайтик легко можно.
Ну если не лень можете сделать тестовый сайт и поставить туда плагин, мне нужен будет доступ только от админки сайта я попробую разобраться
И еще так попробуйте:
$get_a = $wpdb->get_results("" . "SELECT * " . "FROM (SELECT " . RCL_PREF . "achievement.*, " . RCL_PREF . "achievement_stats.date " . "FROM " . RCL_PREF . "achievement, " . RCL_PREF . "achievement_stats " . "WHERE " . RCL_PREF . "achievement.ID = " . RCL_PREF . "achievement_stats.achiev_id " . "AND " . RCL_PREF . "achievement_stats.user_id = $user_id " . "ORDER BY " . RCL_PREF . "achievement_stats.date DESC, " . RCL_PREF . "achievement_stats.ID DESC) as tmp " . "GROUP BY type " . "ORDER BY date DESC, ID DESC " . "LIMIT $limit", ARRAY_A);
Короче вся проблема в том, что mariadb не дружит с ORDER BY в подзапросах FROM, т.е. не хочет сортировать результат подзапроса, я не гуру sql но видимо это как то влияет на производительность, ну или как часто это любят просто кто-то решил что так правильно.
пока есть вариант только с 2умя запросами, может кто подскажет что более интересное, но я тока до такого допер:
$get_a = $wpdb->get_results("" . "SELECT achiev_id " . "FROM " . RCL_PREF . "achievement_stats " . "WHERE ID IN (SELECT MAX(ID) as ID " . "FROM " . RCL_PREF . "achievement_stats " . "WHERE user_id = $user_id " . "GROUP BY type " . "ORDER BY ID DESC)", ARRAY_A); foreach ($get_a as $a) { $a_id_list[] = $a['achiev_id']; } $a_id_list = implode(',', $a_id_list); $get_a = $wpdb->get_results("" . "SELECT " . RCL_PREF . "achievement.*, " . RCL_PREF . "achievement_stats.date " . "FROM " . RCL_PREF . "achievement, " . RCL_PREF . "achievement_stats " . "WHERE " . RCL_PREF . "achievement.ID IN($a_id_list) " . "AND " . RCL_PREF . "achievement.ID = " . RCL_PREF . "achievement_stats.achiev_id " . "ORDER BY date DESC, ID DESC " . "LIMIT $limit", ARRAY_A);
По сути запросы вроде не страшные, несмотря на свой вид. Плюс я добавлю кеш для отображения ачивок и тогда вообще будет пофигу. Пока можете заменить то, что меняли до этого, на то что выше, должно работать.
Доброе утро! Большое спасибо, что продолжаете искать способы решения проблемы. С кодом выше группировка заработала как надо, но есть один косячок:
Если у человека еще нет достижений, то в лк, а также в юзерлисте выводится варнинг следующего содержания:
Warning: implode(): Invalid arguments passed in /var/www/kerncraft1/data/www/mod-land.ru/wp-content/wp-recall/add-on/achievement-system/index.php on line 430
Kerncraft1 сказал(а)
Доброе утро! Большое спасибо, что продолжаете искать способы решения проблемы. С кодом выше группировка заработала как надо, но есть один косячок:Если у человека еще нет достижений, то в лк, а также в юзерлисте выводится варнинг следующего содержания:
Warning: implode(): Invalid arguments passed in /var/www/kerncraft1/data/www/mod-land.ru/wp-content/wp-recall/add-on/achievement-system/index.php on line 430
Перед
foreach ($get_a as $a) {
Добавьте:
if(!$get_a){ return false; }