Не нравятся результаты поиска? Попробуйте другой поиск!

Прошу помочь с MySQL


     11.03.2014    Общие вопросы, Общие вопросы по PHP, MySQL    1419

вопрос
Добрый всем вечер, сижу, ломаю голову, как реализовать подобное, тоесть по раздельности работает на "ура" а вот объединить не получается((

Суть в том что на сайте добавлены через мой модуль материалы, у которых есть рейтинг, при просмотре всех материалов я вывожу рейтинг при помощи подставления ID моего материала к запросу в таблицу с рейтингом, откуда делается подсчет.

Сейчас мне надо сделать, чтоб можно было сортировать материалы по рейтингу. Подскажите пожалуйста как быть, или натолкните на мысль, а то не пойму как сделать. Заранее Спасибо))

Вывод таков:

//запрос на 5 лучших материалов
$index_request= $db->query( "SELECT * FROM " . PREFIX . "_mymaterials WHERE cat='1' ORDER BY name DESC LIMIT 0,5");

if($db->num_rows($index_request) ) {

$tab="<table border=\"0\" width=\"100%\" style=\"border-collapse: collapse\" class=\"mymaterials\">";
$count=0;

while ( $row = $db->get_array( $index_request ) ) {

$name = $row['name'];
$id = $row['id'];
$date1 = $row['date'];
$cat = $row['cat'];
.......

//выполняю запрос к рейтингу
$row2=$db->query("SELECT * FROM " . PREFIX . "_mymaterials_rating WHERE id = '{$id}'");

$rat_count1 = 0;
$rat_summ1=0;

if($db->num_rows($row2) ) {

while ( $row3 = $db->get_array( $row2 ) ) {

$rat_summ1 = $rat_summ1+$row3['num'];

$rat_count1++;
}

$rat_summ1 = $rat_summ1/$rat_count1;

$db->free( $row2 );
}

$tab.= <<<HTML
Вывод на экран нашего материала {$name}, {$cat}, {$rat_summ} / {$rat_count}
HTML;

$count ++;
$i ++;
}

$db->free( $index_request );

Комментарии пользователей (36)

vk_159926832
206 | 5

vk_159926832 - 11 марта 2014 14:56 - Юзер

***Комментарий удален***

dj-avtosh
39

1479 | 390

dj-avtosh - 11 марта 2014 17:04 - шашлычник

Через поле id эти два материала связаны? Делай left join и сортируй по rating.num и +что там у тебя ещё.

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 11 марта 2014 17:31 - шашлычник

Две таблицы*

skype: elhan.isaev

vk_159926832
206 | 5

vk_159926832 - 12 марта 2014 14:29 - Юзер

Примерно такое сделал, всё бы ничего, но возник вопрос почему выводится только одно максимальное значение?? Даже через While выводится только одно.

SELECT *, SUM(num)/COUNT(num) as Nummer FROM dle_mymaterials JOIN dle_mymaterials_rating ORDER BY Nummer LIMIT 0,5

#nummer - выведет собственно процент рейтинга. По нему и идет сортировка в ORDER BY


Подскажите плиз, что не так)

dj-avtosh
39

1479 | 390

dj-avtosh - 12 марта 2014 14:35 - шашлычник

При SUM вроде как нужен GROUP BY

skype: elhan.isaev

vk_159926832
206 | 5

vk_159926832 - 12 марта 2014 15:31 - Юзер

не понял куда подставить. Пытался в разные места, выдавал разные ошибки

dj-avtosh
39

1479 | 390

dj-avtosh - 12 марта 2014 15:47 - шашлычник

Ну напиши в аську, посмотрим.

skype: elhan.isaev

vk_159926832
206 | 5

vk_159926832 - 12 марта 2014 15:49 - Юзер

У меня нет Аськи, может тут? Я просто не знаю куда GROUP BY запихать...

dj-avtosh
39

1479 | 390

dj-avtosh - 12 марта 2014 16:58 - шашлычник

точно перед ORDER BY, и кстати если юзаешь super_query не забывай второй параметр true устанавливать.

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 12 марта 2014 17:00 - шашлычник

JOIN dle_mymaterials_rating


на что джойним?

JOIN dle_mymaterials_rating ON ( dle_mymaterials_rating.id = dle_mymaterials.id )

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 12 марта 2014 17:02 - шашлычник

а ошибку выдавать может, если по факту id там и там есть
SELECT dle_mymaterials.*

skype: elhan.isaev

vk_159926832
206 | 5

vk_159926832 - 12 марта 2014 17:36 - Юзер

Пока юзаю не через super_query, пытаюсь добиться нужного в PHPMyAdmin. А потом перенос в PHP сделаю.

Вот так запрос сделал, тоже выдал одно значение:

SELECT *, SUM(num)/COUNT(num) as Nummer
FROM dle_mymaterials JOIN dle_mymaterials_rating
ON ( dle_rmymaterials.id = dle_mymaterials_rating.id )
ORDER BY Nummer
LIMIT 0,5


И так пробовал, тоже не вышло:

SELECT *, SUM(num)/COUNT(num) as Nummer
FROM dle_mymaterials , dle_mymaterials_rating
ORDER BY Nummer
LIMIT 0,5

dj-avtosh
39

1479 | 390

dj-avtosh - 12 марта 2014 17:40 - шашлычник

Покажи содержимое обеих таблиц.

skype: elhan.isaev

vk_159926832
206 | 5

vk_159926832 - 12 марта 2014 18:54 - Юзер

Это таблица рейтинга dle_mymaterials_rating:

//позже ID будет переименован на material_id
|id|user_id||num|ip|
---------------------------------
|1|2|5|192.168.0.1
|1|6|3|192.168.0.1
|1|3|4|192.168.0.1
|2|2|5|192.168.0.1
|1|1|3|127.0.0.1
|4|1|5|127.0.0.1
|3|1|5|127.0.0.1
|5|1|1|127.0.0.1


А это уже материалы dle_mymaterials:

|id|cat|descr|....
|1|Категория|Описание....
|2|Категория|Описание....
|3|Категория|Описание....

dj-avtosh
39

1479 | 390

dj-avtosh - 12 марта 2014 20:08 - шашлычник

SELECT m.*, SUM(mr.`num`) as nums 
  FROM dle_mymaterials m
   LEFT JOIN dle_mymaterials_rating mr ON ( m.id = mr.id )
    GROUP BY m.id
     ORDER BY nums DESC
    

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 12 марта 2014 20:15 - шашлычник

ну и с делением

SELECT m.*, SUM(mr.`num`)/COUNT(mr.`num`) as nums 
  FROM dle_mymaterials m
   LEFT JOIN dle_mymaterials_rating mr ON ( m.id = mr.id )
    GROUP BY m.id
     ORDER BY nums DESC


можно для полноты картины вот это дело
SUM(mr.`num`)/COUNT(mr.`num`)

Обернуть в CEIL
CEIL(SUM(mr.`num`)/COUNT(mr.`num`))

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 12 марта 2014 20:18 - шашлычник

Так же не запрещается использовать функции ROUND и т.п.

skype: elhan.isaev

vk_159926832
206 | 5

vk_159926832 - 14 марта 2014 13:27 - Юзер

Забыл спросить, а чем отличается ваша группа "шашлычник" от обычных юзеров? :)

vk_159926832
206 | 5

vk_159926832 - 14 марта 2014 13:26 - Юзер

Спасибо большое ,dj-avtosh. Немного доработал под себя :) Ставлю плюс!

dj-avtosh
39

1479 | 390

dj-avtosh - 14 марта 2014 13:34 - шашлычник

Ну, я готовлю шашлык, а юзеры едят просто))

skype: elhan.isaev

vk_159926832
206 | 5

vk_159926832 - 14 марта 2014 14:08 - Юзер

Ахаха, понятно, у меня еще вопрос, вот я когда делю числа в запросе
SUM(mr.`num`)/COUNT(mr.`num`) as nums 

Мне выдаёт 3,5

(изначально выдавало 3,500000 пока я не применил TRUNCATE.)

А когда делю через PHP, то выдаёт 3,75. Откуда взялось такое плохое округление?? И как его убрать

Даже на калькуляторе поделив оценку общую (4+3+3+5) тоесть:
15 на 4 - у меня выдало 3,75.

dj-avtosh
39

1479 | 390

dj-avtosh - 14 марта 2014 14:23 - шашлычник

При чем тут TRUNCATE и количество чисел после запятой?

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 14 марта 2014 14:25 - шашлычник

А если COUNT(mr.`id`)?

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 14 марта 2014 14:26 - шашлычник

А если COUNT(mr.`id`)?

skype: elhan.isaev

vk_159926832
206 | 5

vk_159926832 - 14 марта 2014 14:42 - Юзер

Вы не поняли, после выполнения вот этого
SUM(mr.`num`)/COUNT(mr.`num`) as nums

Выдало 3,500000, после TRUNCATE стало выдавать 3,5 и это хорошо. Но выдает неверное число, так как должно получиться 3,75.

Как - никак выдается 3,5. Даже:
Цитата: dj-avtosh
А если COUNT(mr.`id`)?

dj-avtosh
39

1479 | 390

dj-avtosh - 14 марта 2014 14:44 - шашлычник

По отдельности выполнитьсум и коунт и ппокажи что дают.

skype: elhan.isaev

vk_159926832
206 | 5

vk_159926832 - 14 марта 2014 14:55 - Юзер

SUM(mr.`num`) выдал каким то чудом 14, а должен 15 (5+3+3+4)
COUNT(mr.`num`) выдал верно - 4 шт.

|1|2|5|192.168.0.1
|1|6|3|192.168.0.1
|1|3|4|192.168.0.1
|1|1|3|127.0.0.1

dj-avtosh
39

1479 | 390

dj-avtosh - 14 марта 2014 15:29 - шашлычник

Надо убрать group by и смотреть где null приходит. И если что попробовать юзать COALESCE.

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 14 марта 2014 15:14 - шашлычник

Тип стоит int unsigned?

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 14 марта 2014 15:20 - шашлычник

А попробуй ка INNER JOIN

skype: elhan.isaev

vk_159926832
206 | 5

vk_159926832 - 14 марта 2014 15:26 - Юзер

INNER JOIN тоже выдал 14 и 4.

vk_159926832
206 | 5

vk_159926832 - 15 марта 2014 11:53 - Юзер

Что еще посоветуете?)

dj-avtosh
39

1479 | 390

dj-avtosh - 16 марта 2014 06:45 - шашлычник

В слепую сложно что-то советовать. Шлите бэкап обеих таблиц мне.

skype: elhan.isaev

vk_159926832
206 | 5

vk_159926832 - 16 марта 2014 10:07 - Юзер

Я скину структуру и данные, точнее их код.

vk_159926832
206 | 5

vk_159926832 - 16 марта 2014 10:37 - Юзер

В общем обе таблицы в архиве, скачать тут

vk_159926832
206 | 5

vk_159926832 - 16 марта 2014 12:22 - Юзер

Прошу простить за назойливость, я решил проблему, у меня сравнение стояло, я случайно его поставил, по автомату, так сказать :)

Убрав его всё стало на свои места

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы