[英]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
你有不同的id
和entries
ip=19.123.14.5
。 你想選擇哪一個?
僅用於計算ip
並完全忽略id
和entry
:
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.