Косячное место, в /album/includes/users.php(в мобицмс тоже есть)
Не работает режиме ONLY_FULL_GROUP_BY, группировка неясно к чему, не нужна она там))
Измененый пример (+/-)
// Список посетителей. у которых есть фотографии
switch ($mod) {
case 'boys':
// $sql = "WHERE `users`.`sex` = 'm'";
$sql = "AND `usr`.`sex` = 'm'";
break;
case 'girls':
// $sql = "WHERE `users`.`sex` = 'zh'";
$sql = "AND `usr`.`sex` = 'zh'";
break;
default:
// $sql = "WHERE `users`.`sex` != ''";
$sql = "AND `usr`.`sex` <> ''";
}
$menu = array(
(!$mod ? '<b>' . _t('All') . '</b>' : '<a href="?act=users">' . _t('All') . '</a>'),
($mod == 'boys' ? '<b>' . _t('Guys') . '</b>' : '<a href="?act=users&mod=boys">' . _t('Guys') . '</a>'),
($mod == 'girls' ? '<b>' . _t('Girls') . '</b>' : '<a href="?act=users&mod=girls">' . _t('Girls') . '</a>')
);
echo '<div class="phdr"><a href="index.php"><b>' . _t('Photo Albums') . '</b></a> | ' . _t('List') . '</div>' .
'<div class="topmenu">' . implode(' | ', $menu) . '</div>';
$idu = $db->query("SELECT `id` FROM `users` usr WHERE `usr`.`id` IN (
SELECT `user_id` FROM `cms_album_files`
) $sql
")->fetchAll(PDO::FETCH_COLUMN);
$total = count($idu);
if ($total) {
$id = join(',', $idu);
$req = $db->query("SELECT `usr`.`id` AS `uid`, `usr`.`name` AS `nick` , (
SELECT count( * ) FROM `cms_album_files` WHERE `user_id` = `usr`.`id`) 'count'
FROM `users` usr
WHERE `usr`.`id` IN ($id) $sql
ORDER BY `usr`.`name` ASC LIMIT $start, $kmess
");
П.С. Кстати у меня движек работае на php5.5 нормально, пока еще не заметил несовместимости
# kantry (11.06.2017 / 22:14)
Косячное место, в /album/includes/users.php(в мобицмс тоже есть)
Не работает режиме ONLY_FULL_GROUP_BY, группировка неясно к чему, не нужна она там))
Суть: надо вывести пользователей, у которых есть какие-нибудь фотки.
Модуль писался давно, посему SQL запросы разумеется можно доработать, к примеру вместо группировки применить DISTINCT, или придумать что то еще...
Но однозначно, твой запрос мне не нравится, с этим имплодом ключей и последующим запросом очень уж индокодом попахивает и меня терзают смутные сомнения, что при большом к-ве фоток будет сильно грузить систему.
Хотя разумеется это "навскидку", тестирование я не проводил и может ошибаюсь...
Добавлено: 11.06.2017 / 23:02
AlkatraZ, Не сомневайся, проверил;-) Единственное чего там не хватает, это ключа по полу. Ну и само собой желательно все это переделать на подготовленные выражения, тогда и запросы придется разрулить
Добавлено: 11.06.2017 / 23:29
P.S. Сразу не обратил внимания, в этом случае, сортировка не нужна, это еще один плюс.
-- ORDER BY usr.`name` ASC /* Using filesort не нужен */
AlkatraZ, ******
Надо прекращать ночную деятельность
Накосячил вчера, даже совестно как то
Поправил (+/-)
$total = $db->query("SELECT count(*) FROM `users` usr WHERE `usr`.`id` IN (
SELECT `user_id` FROM `cms_album_files`
) $sql
")->fetchColumn();
if ($total) {
$req = $db->query("SELECT `usr`.`id` AS `uid`, `usr`.`name` AS `nick` , (
SELECT count( * ) FROM `cms_album_files` WHERE `user_id` = `usr`.`id`) 'count'
FROM `users` usr
WHERE `usr`.`id` IN (
SELECT user_id FROM cms_album_files
) $sql
ORDER BY `usr`.`name` ASC LIMIT $start, $kmess
");
fetchAll весь столбец вытягивал, а оно надо?
# kantry (12.06.2017 / 11:11)
fetchAll весь столбец вытягивал, а оно надо?
Ну а я о чем
Ничего, главное, что в итоге идем к верному решению.
# kantry (12.06.2017 / 11:11)
WHERE `usr`.`id` IN
Тут тоже спорное место. Ты почему то отдаешь явное предпочтение WHERE IN вместо JOIN (которые люблю я).
Но по этому поводу были исследования, уже не помню где, ссылку потерял, но кину другую ссылку на оферфлоу, где исследовали похожую тему:
https://stackoverflow.com/ques ... auses
В переводе там отвечают приближенно следующее:
Теоретически два запроса эквивалентны. Я думаю, что это просто плохая реализация оптимизатора запросов MySQL, что заставляет JOIN быть более эффективным, чем WHERE IN. Поэтому я всегда использую JOIN.
Добавлено: 12.06.2017 / 12:14
AlkatraZ, Я одинаково к ним отношусь
Пример то написал совсем не для того что бы идеализировать запросы(это попутное решение) а для того что бы выкинуть ненужную группировку, которая к тому же скрипт ломала.
Очень хорошо отношусь к join но тут огород с ним получится.
Добавлено: 12.06.2017 / 12:24
Теоретически два запроса эквивалентны.
Прочитал, с чего бы это они эквивалентны? Если в join добавить group by то да, но от этого я и избавлялся))
Добавлено: 12.06.2017 / 13:39
Теоретически, если не выводить счетчик, фоток у каждого юзера, то запрос можно было бы вообще упростить, поменяв местами таблицы. Запрос делаем не в альбомы а к юзерам и далее INNER JOIN в `album_files`. Как итог, мы получим список юзеров, у которых есть хотя бы одна фотка.
Добавлено: 12.06.2017 / 13:41
Но по любому, твой последний запрос мне уже нравится.
И нравится стремление избавиться от GROUP BY, ибо эта конструкция в большинстве случаев требует создания временных таблиц, что нагружает и замедляет сервер.
mail/locale/ru/default.po
328 пользователь добаил вас в игнор