[英]Count total number of string matches for each name in MySQL
我正在用 HTML 创建一个预测记录表,该表以每月和总计每个预测器的胜负格式显示胜负。 下表显示了预期的结果。 我在 MySQL 中使用 PHP。
预测器名称 | 每月预测记录(赢/输) | 总记录(赢/输) |
---|---|---|
穆基亚历山大 | 2-0 | 3-1 |
赞恩·西蒙 | 1-2 | 2-3 |
我使用以下代码组合了 2 个不同的 MySQL 表
SELECT results.result_id, results.result, results.match_date, predictors.predictor_name
FROM results
INNER JOIN predictors ON results.predictor_id=predictors.predictor_id
要获取此示例数据
结果 ID | 结果 | 比赛日期 | 预测器名称 |
---|---|---|---|
1 | 赢 | 2021/01/01 | 穆基亚历山大 |
2 | 损失 | 2021/01/01 | 赞恩·西蒙 |
3 | 损失 | 2021/07/01 | 赞恩·西蒙 |
4 | 损失 | 2021/07/01 | 赞恩·西蒙 |
5 | 损失 | 2021/01/01 | 穆基亚历山大 |
6 | 赢 | 2021/07/01 | 穆基亚历山大 |
7 | 赢 | 2021/07/01 | 穆基亚历山大 |
8 | 赢 | 2021/01/01 | 赞恩·西蒙 |
9 | 赢 | 2021/07/01 | 赞恩·西蒙 |
我正在努力寻找一种方法来计算每个预测器 (predictor_name) 有多少胜利,以及他们有多少失败。
创建表 SQL
火柴
CREATE TABLE `matches` (
`match_id` int(50) NOT NULL AUTO_INCREMENT,
`match_name` varchar(50) NOT NULL,
`match_result` varchar(50) NOT NULL,
`match_specific_result` varchar(50) NOT NULL,
`match_super_specific_result` varchar(50) NOT NULL,
`match_date` date NOT NULL,
PRIMARY KEY (`match_id`),
KEY `match_name` (`match_name`),
KEY `match_result` (`match_result`),
KEY `match_specific_result` (`match_specific_result`),
KEY `match_super_specific_result` (`match_super_specific_result`),
KEY `match_date` (`match_date`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
预测
CREATE TABLE `predictions` (
`prediction_id` int(50) NOT NULL AUTO_INCREMENT,
`predictor_id` int(50) NOT NULL,
`match_id` int(50) NOT NULL,
`prediction` varchar(50) NOT NULL,
`specific_prediction` varchar(50) NOT NULL,
`super_specific_prediction` varchar(50) NOT NULL,
PRIMARY KEY (`prediction_id`),
KEY `predictor_id` (`predictor_id`),
KEY `match_id` (`match_id`),
KEY `prediction` (`prediction`),
KEY `specific_predicion` (`specific_prediction`),
KEY `super_specific_prediction` (`super_specific_prediction`),
CONSTRAINT `predictions_ibfk_1` FOREIGN KEY (`predictor_id`) REFERENCES
`predictors` (`predictor_id`),
CONSTRAINT `predictions_ibfk_2` FOREIGN KEY (`match_id`) REFERENCES
`matches` (`match_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
预测器
CREATE TABLE `predictors` (
`predictor_id` int(50) NOT NULL AUTO_INCREMENT,
`predictor_name` varchar(50) NOT NULL,
PRIMARY KEY (`predictor_id`),
KEY `predictor_name` (`predictor_name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8,
结果
CREATE TABLE `results` (
`result_id` int(50) NOT NULL AUTO_INCREMENT,
`predictor_id` int(50) NOT NULL,
`prediction_Id` int(50) NOT NULL,
`prediction` varchar(50) NOT NULL,
`specific_prediction` varchar(50) NOT NULL,
`super_specific_prediction` varchar(50) NOT NULL,
`match_id` int(50) NOT NULL,
`match_result` varchar(50) NOT NULL,
`match_specific_result` varchar(50) NOT NULL,
`match_super_specific_result` varchar(50) NOT NULL,
`result` varchar(50) NOT NULL,
`specific_result` varchar(50) NOT NULL,
`super_specific_result` varchar(50) NOT NULL,
`match_date` date NOT NULL,
PRIMARY KEY (`result_id`),
KEY `predictor_id` (`predictor_id`),
KEY `prediction_Id` (`prediction_Id`),
KEY `prediction` (`prediction`),
KEY `specific_prediction` (`specific_prediction`),
KEY `super_specific_prediction` (`super_specific_prediction`),
KEY `match_result` (`match_result`),
KEY `match_specific_result` (`match_specific_result`),
KEY `match_super_specific_result` (`match_super_specific_result`),
KEY `result` (`result`),
KEY `specific_result` (`specific_result`),
KEY `super_specific_result` (`super_specific_result`),
KEY `match_date` (`match_date`),
KEY `match_id` (`match_id`),
CONSTRAINT `results_ibfk_1` FOREIGN KEY (`predictor_id`) REFERENCES
`predictors` (`predictor_id`),
CONSTRAINT `results_ibfk_2` FOREIGN KEY (`match_id`) REFERENCES
`matches` (`match_id`),
CONSTRAINT `results_ibfk_3` FOREIGN KEY (`prediction_Id`) REFERENCES
`predictions` (`prediction_id`),
CONSTRAINT `results_ibfk_4` FOREIGN KEY (`prediction`) REFERENCES
`predictions` (`prediction`),
CONSTRAINT `results_ibfk_5` FOREIGN KEY (`match_result`) REFERENCES
`matches` (`match_result`),
CONSTRAINT `results_ibfk_6` FOREIGN KEY (`match_specific_result`)
REFERENCES `matches` (`match_specific_result`),
CONSTRAINT `results_ibfk_7` FOREIGN KEY (`match_super_specific_result`)
REFERENCES `matches` (`match_super_specific_result`),
CONSTRAINT `results_ibfk_8` FOREIGN KEY (`match_date`) REFERENCES
`matches` (`match_date`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
PHP
<?php
class Dbh {
private $servername;
private $username;
private $password;
private $dbname;
protected function connect() {
$this->servername = "localhost";
$this->username = "root";
$this->password = "";
$this->dbname = "prediction";
$conn = new mysqli($this->servername, $this->username, $this-
>password, $this->dbname);
return $conn;
}
}
?>
<?php
class Predictors_Results extends Dbh {
protected function getAllPredictors_Results() {
$sql = "SELECT concat(sum(win),'-',sum(loss)) FROM (
SELECT results.result_id, results.result, results.match_date,
predictors.predictor_name
FROM results
INNER JOIN predictors ON
results.predictor_id=predictors.predictor_id) as A
group by predictor_name";
$result = $this->connect()->query($sql);
$numRows = $result->num_rows;
if ($numRows > 0) {
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
return $data;
}
}
}
?>
<?php
class ViewPredictors_Results extends Predictors_Results
{
public function showAllPredictors_Results()
{
$datas = $this->getAllPredictors_Results();
foreach ($datas as $data)
{
// Gets current date and date of the prediction
$full_record_date = $data["match_date"];
$record_date = substr($full_record_date, 0, -3);
$current_date = date("Y-m");
// If the current date matches the date of the prediction
if ($current_date == $record_date)
{
$basicresult = mysql_query("SELECT * FROM results WHERE `result` = 'win'");
$num_rows = mysql_num_rows($basicresult);
echo $num_rows . " Rows\n";
};
//Post into table
echo "<tr>
<td>" . $data['predictor_name'] . "</td>
</tr>";
}
}
}
?>
<table class="table-styling">
<tr>
<th>Predictor Name</th>
<th>Latest Month Record</th>
<th>Full Record</th>
</tr>
<?php
$predictors_results = new ViewPredictors_Results();
$predictors_results->showAllPredictors_Results();
?>
</table>
如果您向我们提供了表架构,我们可以更好地帮助您。 但是,假设您的结果表为 A。您需要使用 group by 来做到这一点。
Select concat(sum(win),'-',sum(loss)) as 'Total Record (wins/losses)' FROM
(
SELECT results.result_id, results.result, results.match_date, predictors.predictor_name
FROM results
INNER JOIN predictors ON results.predictor_id=predictors.predictor_id
) as A
group by predictor_name
您可以在 group by 中使用match_date
来获得每月结果。
编辑==============
提供您的表架构后,您可以使用如下所示的内容,然后将此输出与预测器连接起来以获取预测器名称。
SELECT predictor_id,Concat(Sum(A.Wins),'-',Sum(A.Losses)) FROM (
SELECT predictor_id,count(1) as Wins,0 as Losses FROM `results` WHERE result='win'
group by predictor_id
Union
SELECT predictor_id, 0 as Wins, count(1) as Losses FROM `results` WHERE result='loss'
group by predictor_id
) as A
group by predictor_id;
对于每月结果,在 mysql 中使用 Month() 函数:
Select predictor_id,month,Concat(Sum(A.Wins),'-',Sum(A.Losses)) as 'Monthly Prediction Record (wins/losses)' FROM (
SELECT predictor_id,MONTH(match_date) as month,count(1) as Wins,0 as Losses FROM `results` WHERE result='win'
group by predictor_id
Union
SELECT predictor_id,MONTH(match_date) as month, 0 as Wins, count(1) as Losses FROM `results` WHERE result='loss'
group by predictor_id,MONTH(match_date) ) as A
group by predictor_id,month;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.