2014-08-29 64 views
2

我正在嘗試使用PHP文件或SQL將通過大型data表來計算單元格組合的數量並在新的data_sum表中計數它們的數量。mysql計數獨特的單元格組合,爲空

我在工作的PHP文件的想法:

$popdata = mysql_query("SELECT * FROM data"); 
    while($add = @mysql_fetch_array($popdata)){   
     $qitem1 = "SELECT * FROM data_sum WHERE item1='".$add['item1']."'"; 
     $ritem1 = mysql_query($qitem1); 
     if(mysql_num_rows($ritem1) > 0){ 
      while($add2 = @mysql_fetch_array($ritem1)){ 
       $qitem2 = "SELECT * FROM data_sum WHERE item2='".$add['item2']."'"; 
       $ritem2 = mysql_query($qitem2); 
       if (mysql_num_rows($ritem2) > 0){ 
        $sql = "UPDATE Count=Count + 1 WHERE item1='".$add['item1']."' AND item2='".$add['item2']."'"; 
        $update = mysql_query($sql); 
       } else{ 
        $sql = "INSERT INTO data_sum (item1, item2) VALUES('$item1', '$item2')"; 
        $insert = mysql_query($sql); 
      } 
     } else{ 
      $sql = "INSERT INTO data_sum (item1, item2) VALUES('$item1', '$item2')"; 
      $insert = mysql_query($sql); 
     } 

如果我有一個表:

`data` 
item1 item2 
    1   (this row counts to both the '1,2' duo as well as the '1,3') 
    1  2 
    1  3 
    1  3 
    2  3 

而且我想它凝結成類似:

 `data_sum` 
item1 item2 Count 
    1  2  2 
    1  3  3 
    2  3  1 

是的,我知道data只有5行,計數總共是6.我希望沒有任何細胞在他們的計數對每個可能的分支。有沒有辦法在SQL中使用COUNT或UNIQUE或DISTINCT執行此操作?謝謝!

回答

1

, 下面的查詢你想要做什麼,做了單獨的兩組計算:

select base.item1, base.item2, base.cnt + coalesce(sum(extra.cnt), 0) 
from (select item1, item2, count(*) as cnt 
     from data 
     where item1 is not null and item2 is not null 
     group by item1, item2 
    ) base join 
    (select item1, item2, count(*) as cnt 
     from data 
     where item1 is null or item2 is null 
     group by item1, item2 
    ) extra 
    on base.item1 = extra.item1 or 
     base.item2 = extra.item2 or 
     (extra.item1 is null and extra.item2 is null) 
group by base.item1, base.item2, base.cnt; 

Here是SQL小提琴。

+0

按預期工作!非常感謝! – Kragalon 2014-08-30 03:17:12

+0

我確實有一個問題。在SQL小提琴上,左邊的代碼去哪裏?那是我如何構建我的桌子?或者我用PHP運行這兩個查詢?另外,我會用什麼來取代「基地」?謝謝。 – Kragalon 2014-08-30 03:47:14

+0

@Kragalon。 。左邊的代碼是創建表格等。右側的代碼是運行查詢。 – 2014-08-30 03:51:37