簡體   English   中英

MySQL選擇記錄,計算重復數

[英]MySQL select records, count duplicates

我有一個帖子表,每個帖子都有一個IP地址,我想知道IP發布了多少次,通過計算它在數據庫中出現的次數,然后將它出現在屏幕上的次數。 基本上這個:

MySQL表:

id entry     ip
1   abc  19.123.14.5
2   cde  19.123.14.5
3   efg  12.231.22.9

我希望代碼采用它,計算重復數,並輸出計數如下:

id entry     ip       count
1   abc  19.123.14.5    2
2   efg  12.231.22.9    1

到目前為止,這是我的代碼(不起作用):

  $result = mysql_query("SELECT ip, entry, id, COUNT(ip) AS A FROM table_name AS C GROUP BY ip HAVING COUNT A > 1 ORDER BY id DESC");
    $i = 0;
    while($row = mysql_fetch_array($result)) {
        $id = $row['id'];
        $entry = $row['entry'];
        $ip = $row['ip'];
        $count = ?????;
        $i++;
    ?>

    <tr width="100%" align="center">
        <td><?php echo $i; ?></td>
        <td><?php echo $id; ?></td>
        <td><?php echo $entry; ?></td>
        <td><?php echo $ip; ?></td>
        <td><?php echo $count ?></td>
        <td>
        <form style="display:inline;" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
            <input type="hidden" value="<?php echo $ip; ?>" name="ip" />
            <input type="hidden" value="<?php echo $id; ?>" name="id" />
            <input type="submit" value="Ban IP" name="submit" />
        </form>
        </td>
    </tr>

    <?php
    }

任何幫助將非常感激!

編輯:不起作用:首先,從我的代碼中可以明顯看出,變量$ count沒有分配給它,因為我不知道放在那里。 其次,我得到這個錯誤:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
SELECT ip, min(entry), max(id) as id, COUNT(ip) AS A 
FROM table_name AS C 
GROUP BY ip
ORDER BY max(id) DESC

由於想按IP和條目分組,因此缺少MAX(id)。 您可以刪除Having>1因為您希望根據示例輸出查看計數= 1

示例腳本:

declare @table table
(
id int,
entry varchar(20),
ip varchar(20)
)
    insert into @table
    values

(1,   'abc',  '19.123.14.5'),
(2,   'cde' , '19.123.14.5'),
(3 ,  'efg',  '12.231.22.9')


SELECT  max(id) as id, ip, max(entry), COUNT(ip) AS count 
FROM @table AS C 
GROUP BY ip
ORDER BY max(id) asc

生產:

id          ip                                        count
----------- -------------------- -------------------- -----------
2           19.123.14.5          cde                  2
3           12.231.22.9          efg                  1

你有不同的identries ip=19.123.14.5 你想選擇哪一個?

僅用於計算ip並完全忽略identry

SELECT ip, COUNT(*)
FROM table_name
GROUP BY ip

12.231.22.9, 1
19.123.14.5, 2

用於選擇可能連接到同一個ip的許多隨機行(這是MySQL特定的,在其他數據庫下不起作用):

SELECT id, entry, ip, COUNT(*)
FROM table_name
GROUP BY ip

3, efg, 12.231.22.9, 1
1, abc, 19.123.14.5, 2 // Might also be: 2, cde, 19.123.14.5, 2

用於選擇所有行以及ip計數:

SELECT *, (SELECT COUNT(*) FROM table_name t2 WHERE t1.ip = t2.ip)
FROM
    table_name t1

1, abc, 19.123.14.5, 2
2, cde, 19.123.14.5, 2
3, efg, 12.231.22.9, 1
SELECT t.id, t.entry, t.ip, q.IpCount 
    FROM (SELECT ip, MIN(id) AS MinId, COUNT(*) AS IpCount
              FROM table_name
              GROUP BY ip) q
        INNER JOIN table_name t
            ON q.ip = t.ip
                AND q.MinId = t.id
    ORDER BY t.id DESC;

我相信您要構建的結果/示例表具有不合理的特征。 您不能將ID和ENTRY與IP計數器結合使用。 例如,結果/示例表中的第一行表示IP 19.123.14.5已被發現2次,這是正確的,但將其與ID 1和ENTRY abc相關聯。 為什么? 你不將它與ID 2和ENTRY cde相關聯的原因是什么。 ID為2和ENTRY efg的行上還有另一個錯誤(?...我無法告訴...)。 您提供的初始表中不存在此組合。 具有所有4列的結果表什么也沒說。

除非您始終要顯示第一個(最小)ID,否則請輸入找到特定IP的條目。 是這樣嗎?

如果是這樣,那么您的SQL不正確。 正確的SQL是:

 select aa.min_id as id, 
           b.entry, 
           aa.ip as ip, 
           aa.count_ip as count     
 from table_name b     
 join (select min(a.id) as min_id, 
                 a.ip, 
                 count(a.ip) as count_ip 
          from table_name a 
          group by a.ip) aa 
      on aa.min_id = b.id;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM