2014-08-29 88 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 | 
+-------+-------+----------------------+