Проблема с рейтингом Top 5

#php #mysql #codeigniter

#php #mysql #codeigniter

Вопрос:

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

Я хочу, чтобы он попал в рейтинг top5 по последней записи даты в таблице. Проблема заключается в том, что для идентификатора character_id есть 0. Когда я делаю свой php, чтобы увидеть, нет ли значения, тогда он должен отображать TBD, но он по-прежнему не отображает его в массиве равным 0.

Таблица: top5

 id    ranking #    character_id    status_id    date_created
1         1           1                1         2011-10-17 17:18:54 
2         2           2                1         2011-10-17 17:18:54    
3         3           3                1         2011-10-17 17:18:54
4         4           4                1         2011-10-17 17:18:54
5         5           5                1         2011-10-17 17:18:54
6         1           6                1         2011-10-24 12:18:54
7         2           7                1         2011-10-24 12:18:54
8         3           8                1         2011-10-24 12:18:54
9         4           9                1         2011-10-24 12:18:54
10        5           0                1         2011-10-24 12:18:54

function getTop5()
{
    $this->db->select('characters.character_name, top5.character_id'); 
    $this->db->from('top5'); 
    $this->db->join('characters', 'characters.id = top5.character_id'); 
    $this->db->where('top5.status_id', '1');  
    $this->db->order_by('top5.date_created','desc');
    $this->db->limit(5);
    $query = $this->db->get();
    return $query->result_array();
}

Array ( [0] => 
       Array ( [character_name] => "Mr. Magnificent" Matt Sharp 
               [character_id] => 9 ) 
        [1] => 
       Array ( [character_name] => "The Unforgettable" Jimmy Watkins 
               [character_id] => 8 ) 
        [2] => 
       Array ( [character_name] => Romie Rains 
               [character_id] => 7 ) 
        [3] => 
       Array ( [character_name] => Monica Dawson 
               [character_id] => 6 ) 
        [4] => 
       Array ( [character_name] => "The Outlaw" Mike Mayhem 
               [character_id] => 5 ) )
  

РЕДАКТИРОВАТЬ: кто-нибудь еще хочет попробовать?

Так потерялся и до сих пор не могу получить желаемых результатов

Комментарии:

1. Я думаю, вы хотите order_by('top5.ranking');

2. Я предполагаю, что последний день — 24-й?

3. «последний день» означает текущий день или вчера? Или дата последней записи в таблице?

Ответ №1:

Вы хотели бы упорядочить по top5.date_created в порядке убывания. Если вам действительно нужен только последний день, вам также нужно условие WHERE для этого.

Ответ №2:

Не уверен, что это за класс db, но просто добавьте

 AND date(date_created) = CURDATE();
  

к запросу

или добавить DESC к ORDER предложению

Итак, что-то вроде

 $this->db->select('characters.character_name, top5.character_id'); 
$this->db->from('top5'); 
$this->db->join('characters', 'characters.id = top5.character_id'); 
$this->db->where('top5.status_id', '1'); 
// WHERE date(top5.date_created) = CURDATE() 
$this->db->order_by('top5.date_created');
$this->db->limit(5);
$query = $this->db->get();
  

Комментарии:

1. NOW() также включает время, поэтому не получится получить все в один и тот же день. Вы хотели бы сделать AND DATE(date_created) = CURDATE()

2. Я обновил свой пост, указав, как выглядит возвращаемый массив, что не является правильной информацией.

3. @BrianGlaz: ах, спасибо. Я никогда не работал со столбцом даты, поэтому я не знал об этом

4. Это не сработает, Брайан, потому что это будет для каждого месяца, поэтому одинаковые результаты должны быть за одно и то же время через 3 недели.

5. Итак, мне нужно добавить в строку с комментариями?

Ответ №3:

 function getTop5()
{
    $this->db->select('characters.character_name, top5.character_id'); 
    $this->db->from('top5'); 
    $this->db->join('characters', 'characters.id = top5.character_id'); 
    $this->db->join( '( SELECT DATE(MAX(date_created)) AS lastdate
                        FROM top5 
                        WHERE status_id = 1
                      ) AS tm'
                   , 'top5.created_at >= tm.lastdate 
                      AND top5.created_at < tm.lastdate   INTERVAL 1 DAY'); 
    $this->db->where('top5.status_id', '1'); 
    $this->db->order_by('top5.ranking','asc');
    $this->db->limit(5);
    $query = $this->db->get();
    return $query->result_array();
}
  

Комментарии:

1. Это не с последнего дня, а с последней записи даты. Есть разница.

2. @Mr.Magoo: Я не могу понять, о чем ваш последний комментарий. Последний день, последняя дата, в чем разница?

3. Это последняя запись даты. Итак, из таблицы это будут нижние 5 записей, потому что их дата более поздняя.

4. Я думал, что мне это понадобится для этого запроса. Все это написано для CodeIgniter.

5. Ваш запрос должен работать правильно и показывать последние 5 записей (с status_id = 1). Если только ваши методы (например limit() , один) не работают должным образом.