简体   繁体   English

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

[英]Count total number of string matches for each name in MySQL

I am creating a prediction record table in HTML that displays the wins and losses in the format wins-losses for each predictor per month and total.我正在用 HTML 创建一个预测记录表,该表以每月和总计每个预测器的胜负格式显示胜负。 The table below shows the expected outcome.下表显示了预期的结果。 I am using PHP with MySQL.我在 MySQL 中使用 PHP。

Predictor Name预测器名称 Monthly Prediction Record (wins/losses)每月预测记录(赢/输) Total Record (wins/losses)总记录(赢/输)
Mookie Alexander穆基亚历山大 2-0 2-0 3-1 3-1
Zane Simon赞恩·西蒙 1-2 1-2 2-3 2-3

I have combined 2 different MySQL tables using the following code我使用以下代码组合了 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

To get this sample data要获取此示例数据

result_id结果 ID result结果 match_date比赛日期 predictor_name预测器名称
1 1 Win 2021/01/01 2021/01/01 Mookie Alexander穆基亚历山大
2 2 Loss损失 2021/01/01 2021/01/01 Zane Simon赞恩·西蒙
3 3 Loss损失 2021/07/01 2021/07/01 Zane Simon赞恩·西蒙
4 4 Loss损失 2021/07/01 2021/07/01 Zane Simon赞恩·西蒙
5 5 Loss损失 2021/01/01 2021/01/01 Mookie Alexander穆基亚历山大
6 6 Win 2021/07/01 2021/07/01 Mookie Alexander穆基亚历山大
7 7 Win 2021/07/01 2021/07/01 Mookie Alexander穆基亚历山大
8 8 Win 2021/01/01 2021/01/01 Zane Simon赞恩·西蒙
9 9 Win 2021/07/01 2021/07/01 Zane Simon赞恩·西蒙

I am struggling to find a way to count how many wins each predictor (predictor_name)has, as well as how many losses they have.我正在努力寻找一种方法来计算每个预测器 (predictor_name) 有多少胜利,以及他们有多少失败。

Create Tables SQL创建表 SQL

Matches火柴

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

Predictions预测

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

Predictors预测器

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,

Results结果

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

 <?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>

If you provided us the table schema we could help you better.如果您向我们提供了表架构,我们可以更好地帮助您。 However suppose your result tables as A. You need use group by to do that.但是,假设您的结果表为 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

You can use match_date in group by to get monthly result.您可以在 group by 中使用match_date来获得每月结果。

EDIT==============编辑==============

After providing your table schema, you can use something like below and then join this output with predictors to get the predictor name.提供您的表架构后,您可以使用如下所示的内容,然后将此输出与预测器连接起来以获取预测器名称。

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;

For monthly result use Month() function in mysql:对于每月结果,在 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