2017-02-20 16 views
1

Мне было интересно, как я могу сделать запрос, который будет показывать количество, которое мне нужно с помощью codeigniter?Как считать на основе где в mysql? php

EX: Представлено выбрать 90 и 56

$this->db->where('atr_id', 90); 
$this->db->or_where('atr_id', 56); 

List_table

id  | item_id | atr_id 
--------------------------------------- 
    1  |  1  | 56 
    2  |  1  | 90 
    3  |  2  | 56 
    4  |  2  | 90 
    5  |  2  | 92 

ожидаемый доход будет выглядеть следующим образом.

item_id | active_attr | total_attr 
---------------------------------------------- 
     1  |  2  |  2  // active_attr (90,56) and total_attr (90 , 56) 
     2  |  2  |  3  // active_attr (90,56) and total_attr (90, 56, 92) 

В active_attr подсчитывает количество atr_id найдено (90, 56) в item_id

И total_attr подсчитывает общее количество atr_id в качестве item_id

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

+0

Не могли бы вы пояснить, как 'active_attr' приводит к 2 для' item_id' 2? –

+0

@ DarshanMehta 'active_attr' находятся 56 и 90 найдено –

+1

Посмотрите мои обновления с CI –

ответ

1

Я думаю, что вы хотите это GROUP BY, и это SQL-запрос может дать ваш ожидаемый доход на одного время.

SELECT a.item_id, COUNT(DISTINCT a.atr_id) as active_attr, 
COUNT(DISTINCT b.atr_id) as total_attr 
FROM test2 a 
INNER JOIN test2 b ON a.item_id=b.item_id 
WHERE a.atr_id=56 OR a.atr_id=90 
GROUP BY a.item_id 

И это образец запроса ци.

<?php 
    $res = $this->db 
       ->select('a.item_id, COUNT(DISTINCT a.atr_id) as active_attr, COUNT(DISTINCT b.atr_id) as total_attr') 
       ->join('test2 as b', 'a.item_id=b.item_id') 
       ->where('a.atr_id', 56) 
       ->or_where('a.atr_id', 90) 
       ->group_by('a.item_id') 
       ->get('test2 as a') 
       ->result(); 
+0

Я пробовал, и это сработало! Спасибо! :) просто любопытно, кто имеет лучшую производительность с @ thomas-g –

0

Вы ищете грани (или классификации) результата.

Я бы использовал ваш первый запрос, прочитал результирующий набор с циклом и заполнил две грани (две карты) одним сканированием.

$item_facet = array(); 
$atr_facet = array(); 

foreach($query->result() as $row){ 
    $item_id = $row->item_id; 
    $atr_id = $row->atr_id; 
    $item_facet = increment($item_facet, $item_id); 
    $atr_facet = increment($atr_facet, $atr_id); 
} 

function increment($map, $id){ 
    if(isset($map[$id])){ 
     $map[$id] = $map[$id] + 1; 
    }else{ 
     $map[$id] = 1; 
    } 
    return $map; 
} 

В качестве альтернативы эти два GROUP BY SQL запросов

1

Вы можете добиться того, что вы хотите с этим запросом

SELECT item_id, 
     SUM(
      CASE 
        WHEN atr_id = 90 THEN 1 
        WHEN atr_id = 56 THEN 1 
        ELSE 0    
       END 
      ) AS active_attr, 
      COUNT(*) AS total_atr 
FROM List_table 
GROUP BY item_id 

Так что вам не нужно ИНЕКЕ, отсчеты вашей active_attr является сделанный в SELECT с помощью оператора CASE. CASE вернет 1 для ваших представленных значений (56 и 90) и 0 для остальных, тогда вы SUM все 1s, чтобы получить счет.

+0

, есть ли способ, который будет в кодеригере? Я пробовал его в строке sql, и он работает :) –

+1

Прошу прощения, но у меня нет знаний в codeigniter. SQL FTW :) –

0

вы использовали группу по методу:

$this->db->group_by('item_id'); 
$this->db->order_by('item_id', 'desc'); 

Это даст результат, как

| ITEM_ID | TOTAL | 
| 12 | 3 | 
| 15 | 2 |