2017-02-20 44 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

的數量和的item_id

atr_idtotal_attr計數總數這裏真的需要幫助的感謝你們。 ..

+0

請問您能澄清'item_id'的active_attr結果是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 

這是ci查詢示例。

<?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 

所以你並不需要一個WHERE子句,你active_attr的計數是用CASE語句在SELECT中完成。 CASE將爲您提交的值(56和90)返回1,其餘爲0,然後您將所有的1加起來以計算結果。

+0

的更新有沒有什麼方法可以用codeigniter格式?我在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 | 
相關問題