Ребята, как выполнить определение места пользователя. к примеру есть таблица оценок : uid - это иды пользователей которых оценивали. ball - это оценка. еще есть таблица пользователей: id - id пользователя tip - это тип пользователя, оценивается только тип 4, а два не трогаем.. Рейтинг для одного пользователя реализовал таким способом, но это только его индивидуальный рейтин = сумма оценок / сумма оценивших . Код (Text): $o=(sprintf("%01.1f", $db->one_data('SELECT AVG(ball) FROM '.DB_PREFIX."ocenka WHERE uid='$user[id]'"))); количество нужных нам пользователей, среди которых отбираем лучших: Код (Text): $k=$db->one_data('SELECT COUNT(*) FROM '.DB_PREFIX."users WHERE id AND tip=4"); как это все объединить, чтобы получить к примеру UserGOOD (1-й из 50) . помогите, весь день в css разбирался, на php голова вовсе не варит уже) да и слаб я в этом очень.. ЗАРАНЕЕ БЛАГОДАРЕН!
По приведённым скриншотам кто на первом месте? Определять по: "хорошо доставил", "отлично"? Или по каким критериям? Как я вижу у zx16 descr=Нормально
Василий и zx16 к примеру вот их два человека, нам нужно вывести строку в личном кабинете к примеру, у zx16 - 1й из 2 . понимаете? блин, картинки обрезаны. нет полей еще дополнительных.. 3ka.info/1.png и 3ka.info/2.png . там картины полнее. у каждого юзера есть строка ball в табл оценка, это баллы от других пользователей . и исходя из них нужно определить какую строку юзер занимает из всего количества юзеров
Код (Text): <?php $user="Bio"; // Ник пользователя, который будет проверяться. $link=mysqli_connect("***","***","***","top_users")or die(mysqli_error($link)); $sql="SELECT id,login FROM users WHERE tip=4"; $result=mysqli_query($link,$sql)or die(mysqli_error($link)); $arrUsers=array(); $i=0; $str=""; while($row=mysqli_fetch_assoc($result)){ $arrUsers[]=$row; $str.="{$arrUsers[$i]['id']},"; $i++; } $str=substr($str,0,-1); $sql="SELECT ball,uid FROM ocenka WHERE uid IN($str)"; $result=mysqli_query($link,$sql)or die(mysqli_error($link)); $arrOcenka=array(); while($row=mysqli_fetch_assoc($result)){ $arrOcenka[]=$row; } rsort($arrOcenka); foreach($arrUsers as $v){ if($v["login"]==$user){ $id=$v["id"]; } } $int=count($arrOcenka); foreach($arrOcenka as $k=>$v){ if($v["uid"]==$id) echo "$user ".($k+1)."/ $int"; } ?>
Ну так отсортировать по количеству баллов (по убыванию), и проверять позицию в массиве. Я так сделал. Только для рейтинга отдельную табличку поставил, поскольку у меня связей больше в проекте. А чтоб лишний раз не лазить в БД, сделал кеширование этой таблицы с рейтингами
@zx16: Лучший способ рассказать что-то о базе и напроситься на хорошие запросы — подготовить пример на sqlfiddle.com А скришноты pma это худший способ ))) Насколько я понял твою картину, очень геморно сходу вычислить на каком месте человек внутри своей группы. Рекомендую завести специальную таблицу для ранжирования пользователей и периодически (по крону или вручную) актуализировать ее. Очевидно сортируем пользователей по убыванию avg(ball). Код (Text): SELECT o.uid, AVG(o.ball) AS avg_rating FROM ocenka AS o INNER JOIN users AS u ON o.uid=u.id AND u.tip=4 GROUP BY 1 ORDER BY 2 DESC Трюк с нумерацией строк в выборке с сортировкой можно подсмотреть здесь: http://stackoverflow.com/a/3614741/272885 Код (Text): SELECT t.uid, t.avg_rating, @rownum := @rownum + 1 AS position FROM ( SELECT o.uid, AVG(o.ball) AS avg_rating FROM ocenka AS o INNER JOIN users AS u ON o.uid=u.id AND u.tip=4 GROUP BY 1 ) AS t JOIN (SELECT @rownum := 0) AS r ORDER BY t.avg_rating Остается сохранить эти данные чтобы не вычислять постоянно. Код (Text): TRUNCATE rank; INSERT INTO rank(uid, avg_rating, position) SELECT предыдущий запрос ))) Как часто сохранять — дело твоё. Главное что не при каждом просмотре пользовательского профиля. Теперь у тебя под рукой будет источник откуда ты можешь достать балл и место любого пользователя (из группы 4, мы только ее сохраняли). Код (Text): SELECT avg_rating, position FROM rank WHERE uid=:id
Вижу вы очень хорошо разбираетесь в этом! для меня это сложновато пока(((( чтоб собрать это все в кучу..
не записывает в базу данных(( вот такой следуя вашей инструкции: Код (Text): $sql = ' INSERT INTO top(uid, avg_rating, sumball,position) SELECT t.uid, t.avg_rating, t.sumball, @rownum := @rownum + 1 AS position FROM ( SELECT o.uid, AVG(o.ball) AS avg_rating, SUM(o.ball) AS sumball FROM free_courier_ocenka AS o INNER JOIN free_courier_users AS u ON o.uid=u.id AND u.tip=1 GROUP BY 1 ) AS t JOIN (SELECT @rownum := 0) AS r ORDER BY t.sumball '; я чуть переделал, так как точнее будет выводить рейтинг пользователей по сумме оценок, а не по средней. чуть дописал в код но в базу не пишет значения. ошибок нет после sql запроса . просто база пуста. тип (u.tip=1) изменил в базе, на это не обращайте внимания, и все базы прописал правильно.
если запись не создается, значит ошибка есть. отлаживай. http://phpfaq.ru/debug Добавлено спустя 2 минуты 27 секунд: p.s. подготовь пример с данными sqlfiddle.com , будет больше толку, чем от "ничего не получается помогите". помогают тому, кто сам себе помогает.
ну так нету Код (Text): $sql = ' INSERT INTO top(uid, avg_rating, sumball,position) SELECT t.uid, t.avg_rating, t.sumball, @rownum := @rownum + 1 AS position FROM ( SELECT o.uid, AVG(o.ball) AS avg_rating, SUM(o.ball) AS sumball FROM free_courier_ocenka AS o INNER JOIN free_courier_users AS u ON o.uid=u.id AND u.tip=1 GROUP BY 1 ) AS t JOIN (SELECT @rownum := 0) AS r ORDER BY t.sumball '; if(!mysql_query($sql)) {echo '<center><p><b>Ошибка при добавлении данных!</b></p></center>';} else {echo '<center><p><b>Нормик!</b></p></center>';} выводит НОРМИК! p.s. не пользовался sqlfiddle.com , изучу как он работает. Пока времени нету(
а у нас значит есть время. ок. эксплуатируй нас полностью! сделай еще вывод mysql_affected_rows() сразу после удачной вставки. подозреваю что тупо 0 строк было вставлено, то есть SELECT выдал пустой набор строк для вставки.
запускай phpmyadmin, копируй туда SELECT и разбирайся почему он выдал 0 строк. скорее всего оценок нет. наверное надо изменить запрос так, чтобы он выдавал дефолтовые значения даже при отсутствии оценок — с помощью LEFT JOIN и ifnull() завидую я тебе, столько открытий чудных тебе предстоит
ну а sql запрос на phpmyadmin не выводит никаких ошибок. запрос выполняется и все. все зелененькое и красивое. короче чутка переделал и заработало: старый код: Код (Text): INSERT INTO top(uid, avg_rating, sumball,position) SELECT t.uid, t.avg_rating, t.sumball, @rownum := @rownum + 1 AS position FROM ( SELECT o.uid, AVG(o.ball) AS avg_rating, SUM(o.ball) AS sumball FROM free_courier_ocenka AS o INNER JOIN free_courier_users AS u ON o.uid=u.id AND u.tip=1 GROUP BY 1 ) AS t JOIN (SELECT @rownum := 0) AS r ORDER BY t.sumball новый код: Код (Text): INSERT INTO top(uid, avg_rating, sumball,position) SELECT t.uid, t.avg_rating, t.sumball, @rownum := @rownum + 1 AS position FROM ( SELECT o.uid AS uid, AVG(o.ball) AS avg_rating,SUM(o.ball) AS sumball,COUNT(o.ball) AS position FROM free_courier_ocenka AS o INNER JOIN free_courier_users AS u ON o.uid=u.id AND u.tipt=1 GROUP BY 1 ) AS t JOIN (SELECT @rownum := 0) AS r ORDER BY 3 DESC теперь у нас есть таблица, в которой мы имеем id пользователя (uid) , среднюю его оценку (avg_rating), сумму всех его оценок (sumball) и самое главное - его позицию среди всех оцениваемых пользователей (position) . Огромное спасибо artoodetoo , который возился со мной как мамочка!!