2014-08-29 52 views
-2

我試圖將我在我的數據庫中的數據壓縮成行,並將它們的分數記錄下來以查看最流行的數據。MySql Tally系統與php

如果我有過一個數據表:

`data` 
item1 item2 
    1  
    1  2 
    1  3 
    1  3 
    2  3 

,並希望濃縮版本是:

 `data_sum` 
item1 item2 Tally 
    1  2  2 
    1  3  3 
    2  3  1 

我將如何實現這一目標?我在這裏有一些想法:

$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){ 
      $qitem2 = "SELECT * FROM data_sum WHERE item2='".$add['item2']."'"; 
      $ritem2 = mysql_query($qitem2); 
      if (mysql_num_rows($ritem2) > 0){ 
       $sql = "UPDATE Tally=Tally + 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); 
     } 

是的,我知道總計是比第一個表中的行多一個。我希望具有空列的行可以計算出具有共同因子的兩個計數。這個文件將要經過數千行,所以我想要最高的效率!謝謝!

+1

您是否嘗試過的東西?什麼?什麼都可以? – PeeHaa 2014-08-29 10:25:40

+0

是的,但它很長。我正試圖縮短它爲你的想法。 – Kragalon 2014-08-29 10:37:59

回答

1

您只需創建一個新表,然後將INSERT語句與GROUP BY'SELECT語句組合起來。這將COUNT()的次數item1item2是相同的,並將它們存儲在新的Tally'd表中。

東西線沿線的:

INSERT INTO new_tally_table (item1, item2, Tally) 
SELECT item1, item2, COUNT(*) 
FROM table 
GROUP BY item1, item2 

編輯:
其實重讀你的問題的最後一位。想想你想要的是這樣的:

SELECT item1, item2, COUNT(*) 
FROM (
    SELECT i1.item1, i2.item2 
    FROM table1 as i1 
    INNER JOIN (
     SELECT DISTINCT item1, item2 
     FROM table1 WHERE item2 IS NOT NULL 
    ) as i2 ON (i1.item1 = i2.item1) 
    WHERE i1.item2 IS NULL 
    UNION ALL 
    SELECT item1, item2 
    FROM table1 
    WHERE item2 IS NOT NULL 
) as t 
GROUP BY item1, item2 

雖然可能有更好的寫作方式。

0

有可能是一個簡單的解決方案,但我想不出它...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,item1 INT NULL 
,item2 INT NULL 
); 

INSERT INTO my_table (item1,item2) VALUES 
(1  ,NULL), 
(1  ,2), 
(1  ,3), 
(1  ,3), 
(2  ,3); 

SELECT x.item1 
    , x.item2 
    , COUNT(DISTINCT y.id) 
    FROM my_table x 
    JOIN my_table y 
    ON y.item1 = x.item1 
    AND (y.item2 = x.item2 OR y.item2 IS NULL) 
    AND y.id <= x.id 
    JOIN 
    (SELECT item1 
      , item2 
      , MAX(id) max_id 
     FROM my_table 
     GROUP 
      BY item1 
      , item2 
    ) z 
    ON z.item1 = x.item1 
    AND z.item2 = x.item2 
    AND z.max_id = x.id 
WHERE x.item2 <> 0 
GROUP 
    BY x.id; 
+-------+-------+----------------------+ 
| item1 | item2 | COUNT(DISTINCT y.id) | 
+-------+-------+----------------------+ 
|  1 |  2 |     2 | 
|  1 |  3 |     3 | 
|  2 |  3 |     1 | 
+-------+-------+----------------------+