собственно сабж. Хочу вывести пользователй, которые добавили хотя бы одну статью или запись в блоге. (типа "наши авторы")
есть похожий снипет, но он выводит топ 10 добавивших ноды любого рода
$users = db_query("SELECT COUNT(nid) AS count, {users}.uid, {users}.name FROM {node} LEFT JOIN {users} ON {node}.uid = {users}.uid WHERE {node}.uid != 0 GROUP BY uid ORDER BY count DESC LIMIT 10");
while ($user = db_fetch_object($users)) {
print "<ul> <a href=\"/user/".$user->uid."\">".$user->name."</a> </ul>";
}
while ($user = db_fetch_object($users)) {
print "<ul> <a href=\"/user/".$user->uid."\">".$user->name."</a> </ul>";
}
Комментарии
SELECT COUNT(nid) AS count_1, u.uid, u.name
FROM {node} n
LEFT JOIN {users} u ON n.uid = u.uid
WHERE n.uid != 0
GROUP BY u.uid, u.name
HAVING count_1>0
");
while ($user = db_fetch_object($users)) {
print "<ul> <a href=\"/user/".$user->uid."\">".$user->name."</a> </ul>";
}
p.s.
Вместо href используйте l($user->name, '/user/' . $user->uid);
Незнаю как в mysql (в её тонкостях не дока), но это точно сработает в mysql 5, в 4-ке кто проверит?
Не рекомендую использовать занятые слова вместо названий полей (count), также желательно иногда использовать алиасы, код читается получше. Да и перевод каретки в нужных местах не помешает.
Никит, а где в снипете выбор вида нод?
пардон, поставь в where :
(n.uid != 0) and (n.type = 'page')
или что там...<?php
$tp = array('page','blog','forum'); // типы по которым нужны лучшие авторы
$maxcount = 10; // ограничение на количество выводимых авторов (на каждый тип)
foreach($tp as $key => $value) {
$result = db_query_range(db_rewrite_sql("
SELECT COUNT(nid) AS count_1, u.uid, u.name
FROM {node} n
INNER JOIN {users} u ON n.uid = u.uid
WHERE n.uid != 0 AND n.type='%s'
GROUP BY u.uid, u.name
HAVING COUNT(nid)>0
ORDER BY COUNT(nid) DESC,u.name"),$value,0,$maxcount);
$items = array();
while ($u = db_fetch_object($result)) {
$u->name .= ' ('.$u->count_1.')';
$items[] = theme('username',$u);
}
if ( count($items) ) {
echo ''.t($value).'
';
echo theme('item_list',$items);
}
}
?>
А потом возникают жалобы, что на сайте все косячится
Ну тут еще можно чтобы не бегать по трём типам: (n.type in '".implode("','", $tp)."'), хотя так нежелательно, но...
olk
Как сделать, чтобы вместо типов матерьялов отображалось имя типа матерьяла?
Например у меня есть тип матерьяла "games" с именем "Игры". А снипет выводит "games" вместо его имени "Игры".
По идее если сделан перевод, то должен выводиться переведенный вариат (так как вывод $value заключен в функцию t(...))
ps. кстати HAVING там не нужен так как применен INNER JOIN, т.е. код может выглядеть так
$tp = array('page','blog','forum'); // типы по которым нужны лучшие авторы
$maxcount = 10; // ограничение на количество выводимых авторов (на каждый тип)
foreach($tp as $key => $value) {
$result = db_query_range(db_rewrite_sql("
SELECT COUNT(nid) AS count_1, u.uid, u.name
FROM {node} n
INNER JOIN {users} u ON n.uid = u.uid
WHERE n.uid != 0 AND n.type='%s'
GROUP BY u.uid, u.name
ORDER BY COUNT(nid) DESC,u.name"),$value,0,$maxcount);
$items = array();
while ($u = db_fetch_object($result)) {
$u->name .= ' ('.$u->count_1.')';
$items[] = theme('username',$u);
}
if ( count($items) ) {
echo ''.t($value).'
';
echo theme('item_list',$items);
}
}
?>
Возможно причина в том, что типы созданые мной и у них нет перевода по умолчанию?
Ну можете добавить в сниппет свой ручной перевод, что нибудь типа
<?php
if ( count($items) ) {
switch ($value) {
case 'games':
$value_ru = 'Игры';
break;
// здесь кэйсы для остальных типов
default:
$value_ru = t($value);
}
echo ''.$value_ru.'
';
echo theme('item_list',$items);
}
?>
Еще как вариант можно задать перевод прямо в массиве типов, и использовать ключ массива как фильтр в селекте, а значение как выводимый аргумент
<?php
// типы по которым нужны лучшие авторы
$tp = array(
'page' => 'Страница',
'blog' => 'Дневник',
'forum' => 'Форум'
);
$maxcount = 10; // ограничение на количество выводимых авторов (на каждый тип)
foreach($tp as $key => $value) {
$result = db_query_range(db_rewrite_sql("
SELECT COUNT(nid) AS count_1, u.uid, u.name
FROM {node} n
INNER JOIN {users} u ON n.uid = u.uid
WHERE n.uid != 0 AND n.type='%s'
GROUP BY u.uid, u.name
ORDER BY COUNT(nid) DESC,u.name"),$key,0,$maxcount);
$items = array();
while ($u = db_fetch_object($result)) {
$u->name .= ' ('.$u->count_1.')';
$items[] = theme('username',$u);
}
if ( count($items) ) {
echo ''.$value.'
';
echo theme('item_list',$items);
}
}
?>
olk
Огромное спасибо!
Вот так получилось:
еще глупый вопрос: Как сделать нумерованный список?