iT邦幫忙

1

[PHP+MySQL] 統計月份內重複的資料出現次數

各位大大,想請問一下
我有個資料表Message

date | message
2020-05-15 | 測試
2020-06-13 | 測試
2020-06-15 | 測試
2020-06-19 | 測試

可以怎麼寫統計"測試"這字串在當月份出現的次數呢?
謝謝!!

1
rogeryao
iT邦高手 1 級 ‧ 2020-06-19 21:02:31
CREATE TABLE Temp(Xdate  DATE, Xmessage varchar(20));
insert into Temp values ('2020-05-15','測試');
insert into Temp values ('2020-05-15','xx');
insert into Temp values ('2020-06-13 ','測試');
insert into Temp values ('2020-06-15','測試');
insert into Temp values ('2020-06-19','測試');
insert into Temp values ('2020-06-19','zz');
insert into Temp values ('2020-06-19','zz');
insert into Temp values ('2020-06-19','zz');
insert into Temp values ('2020-06-19','yy');
select Substring(Xdate,1,7) as XMonth,Xmessage,count(Xmessage) as XCount
from Temp
where Xmessage = '測試'
group by Substring(Xdate,1,7),Xmessage

Demo

看更多先前的回應...收起先前的回應...
特倫斯 iT邦新手 5 級 ‧ 2020-06-19 21:21:48 檢舉

感謝大大幫忙!!

特倫斯 iT邦新手 5 級 ‧ 2020-06-25 22:53:47 檢舉

抱歉大大~我跑出來不順~是哪邊錯誤呢?
https://ithelp.ithome.com.tw/upload/images/20200625/20125113Ky4KgDfWT7.png

<?php
// 建立MySQL的資料庫連接 
$link = mysql_connect("localhost","root","12345");
mysql_select_db("message2",$link);

$sql = mysql_query("select Substring(datetime,1,7) as Month,message,count(message) as Count from message2 where message = '測試' group by Substring(datetime,1,7),message");
echo "<table border='1'>
<tr>
<th>Month</th>
<th>message</th>
<th>Count</th>
</tr>";
while($row = mysql_fetch_array($sql)){
  echo "<tr>";
  echo "<td>" . $row['Month'] . "</td>";
  echo "<td>" . $row['message'] . "</td>";
  echo "<td>" . $row['Count'] . "</td>";
  echo "</tr>";
}
?>
rogeryao iT邦高手 1 級 ‧ 2020-06-25 23:34:22 檢舉
<?php
$servername = "localhost";
$username = "root";
$password = "12345";
$dbname = "test";

$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("資料庫連線失敗: " . mysqli_connect_error());
}

$sql = "select Substring(datetime,1,7) as Month,message,count(message) as Count from message2
        where message = '測試'
        group by Substring(datetime,1,7),message;";

$result = mysqli_query($conn, $sql);

echo "<table border='1'>
<tr>
<th>Month</th>
<th>message</th>
<th>Count</th>
</tr>";

if (mysqli_num_rows($result) > 0)
{
   while($row = mysqli_fetch_assoc($result))
   {
     echo "<tr>";
     echo "<td>" . $row['Month'] . "</td>";
     echo "<td>" . $row['message'] . "</td>";
     echo "<td>" . $row['Count'] . "</td>";
     echo "</tr>";
   }
}
echo "</table>";
mysqli_close($conn);
?>

$servername = "localhost";
連不起來的話改用 IP 參考如下
mysql 訪問許可權

$dbname = "test";
你的 dbname 不會是 "message2" 那是 TableName ,
可能會是 "mysql"

特倫斯 iT邦新手 5 級 ‧ 2020-06-26 00:10:48 檢舉

感謝大大
我剛再測試一下where message = '測試'不能為中文字
改成where message = 'test'
即可正常
不能中文字有甚麼方式可以解決嗎?
https://ithelp.ithome.com.tw/upload/images/20200626/20125113FqO2iRlBmb.pnghttps://ithelp.ithome.com.tw/upload/images/20200626/20125113gXjq4NbTlm.png

rogeryao iT邦高手 1 級 ‧ 2020-06-26 00:22:13 檢舉
0
通靈亡
iT邦研究生 5 級 ‧ 2020-06-19 21:03:35

測試資料:

CREATE TABLE test(
    DateField datetime Primary Key,
    Message nvarchar(200)
);

INSERT INTO test (DateField, Message)
VALUES ('2020-05-15', '測試'),
       ('2020-06-13', '測試'),
       ('2020-06-15', '測試'),
       ('2020-06-19', '測試')

查詢:

SELECT CONCAT(YEAR(DateField),'/',MONTH(DateField)) AS YearMonth,
       Message,
       COUNT(Message)
FROM test
GROUP BY CONCAT(YEAR(DateField),'/',MONTH(DateField)),
         Message

https://www.db-fiddle.com/f/tZ9sbrYpEDjqkUy5Weear6/2

特倫斯 iT邦新手 5 級 ‧ 2020-06-19 21:22:06 檢舉

感謝大大幫忙

CONCAT(YEAR(DateField),'/',MONTH(DateField)) 可以簡化直接用DATE_FORMAT就好。

0
浩瀚星空
iT邦超人 1 級 ‧ 2020-06-20 13:45:12
SELECT DATE_FORMAT(date,'%Y%m') AS ym,message,count(*) AS num FROM `user_agents` group BY ym,message

可善用mysql的函數 DATE_FORMAT 來幫你格式化好你要的日期。
以上的方式比較快速。

可能有人會問 DATE_FORMAT 對字串能否進行轉換。答案是可以的。
只要是正確的日期格式就行。它本身就是用字串格式轉換用的。

對了,忘了說,這招是因為你是日期才能這樣幹。
如果不是日期的話。就得還是用其它兩位字串切法才行。

我要發表回答

立即登入回答