繁体   English   中英

计算 MySQL 中每个名称的字符串匹配总数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM