Codeigniter: сложный запрос с объединением и ограничением - PullRequest
0 голосов
/ 15 мая 2018

мой запрос в codeigniter похож на приведенный ниже,

$select = 'msg.*';
 $this->db->select($select, FALSE)
   ->from(TBL_MESSAGES . ' as msg')
   ->join(TBL_PRODUCT . ' as p', 'msg.ProductId=p.Id');        
   $query = $this->db->order_by('msg.Id', 'DESC')->get();
  if ($query->num_rows() > 0) 
  {
      return $query->result_array();
  }

Здесь я хочу получить в результате все сообщения первых 10 продуктов, но в приведенном выше запросе, если я размещу limit, тогда он показывает всего 10 сообщений

Может ли кто-нибудь помочь мне установить лимит для вышеуказанного запроса?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Надеюсь, это поможет вам:

Либо так:

Сначала соберите свой идентификатор 10 продуктов и используйте их в вышеуказанном запросе с помощью where_in

$product_ids = $this->db->select('Id')->limit(10)->get(TBL_PRODUCT)->result_array();

/* to select most recent msg with product id and name do like this, correct
if product_name column is wrong*/

$select = 'msg.*,p.Id,p.product_name';

/*$select = 'msg.*';*/

$query = $this->db->select($select, FALSE)
   ->from(TBL_MESSAGES . ' as msg')
   ->join(TBL_PRODUCT . ' as p', 'msg.ProductId=p.Id')
   ->where_in('p.Id',$product_ids)   
   ->order_by('msg.Id', 'DESC')
   ->get();
  if ($query->num_rows() > 0) 
  {
      return $query->result_array();
  }

Или вы можете получить все идентификаторы продуктов и просмотреть их с помощью предложения where, чтобы получить желаемый результат

/* to select most recent msg with product id and name do like this, correct
if product_name column is wrong*/

$select = 'msg.*,p.Id,p.product_name';

$product_ids = $this->db->select('Id')->get(TBL_PRODUCT)->result_array();
if ( !empty($product_ids))
{
   foreach($product_ids as $pid)
   {
        $query = $this->db->select($select, FALSE)
                 ->from(TBL_MESSAGES . ' as msg')
                 ->join(TBL_PRODUCT . ' as p', 'msg.ProductId=p.Id')
                 ->where('p.Id',$pid)   
                 ->order_by('msg.Id', 'DESC')
                 ->get();
        if ($query->num_rows() > 0) 
        {
            $data[] = $query->result_array();
        }   
   }
return $data;
}

Для более: https://www.codeigniter.com/user_guide/database/query_builder.html#looking-for-specific-data

0 голосов
/ 15 мая 2018

Чтобы получить желаемый набор результатов, есть 2 способа

1) Сначала получите идентификаторы первых 10 продуктов и в свой запрос просто добавьте фильтр where p.id IN(ids....).Это будет включать в себя 2 запроса.

2) Будет таблица соединяемых сообщений с дополнительным выбором, который выбирает 10 продуктов, таких как

select msg.*
from messages msg
join (
    select *
    from products
    order by id
    limit 10
) p
on msg.ProductId=p.Id

Не уверен, как бы вы преобразовали этот запрос в формате активной записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...