【问题标题】:If 2 different strings from 2 different MYSQLi columns match then count for each ID of a different column using PHP如果来自 2 个不同 MYSQLi 列的 2 个不同字符串匹配,则使用 PHP 计算不同列的每个 ID
【发布时间】:2021-07-26 00:14:24
【问题描述】:

我正在使用 PHP 创建一个表格来显示预测器的名称以及他们做出了多少成功的预测和多少不成功的预测。

结果应该是这样的。

Predictor Name Predictor Record (Wins/Losses)
name1 0/0
name2 0/0

PHP 事实上,我对如何设置有点迷茫。

<table class="table-styling">
          <tr>
            <th>Predictor Name</th>
            <th>Full Record (Wins/Losses)</th>
          </tr> 

        <?php
        $sql = 'SELECT predictors.predictor_id, predictors.predictor_name, predictions.base_prediction, matches.base_result, predictions.specific_prediction, 
                       matches.specific_result, predictions.super_specific_prediction, matches.super_specific_result    
                FROM predictions 
                INNER JOIN matches ON matches.match_id = predictions.match_id
                INNER JOIN predictors ON predictors.predictor_id = predictions.predictor_id';

        $results = $mysqli->query($sql);

        

        if($results->num_rows) {
          while ($row = $results->fetch_object()) {
            echo "<tr>
                    <td>$row->predictor_name</td> 
                    <td>$basePredictionWins/$basePredictionLosses</td>
                  </tr>";
          }

          if ($row->base_result === $row->base_prediction) {
            $basePredictionWins = array_count_values($results);
          }
          if ($row->base_result !== $row->base_prediction) {
            $basePredictionLosses = array_count_values($results);
          }

        }


        ?>

        </table>

主要问题似乎是这些 IF 语句

if ($row->base_result === $row->base_prediction) {
            $basePredictionWins = array_count_values($results);
          }
if ($row->base_result !== $row->base_prediction) {
            $basePredictionLosses = array_count_values($results);
          }

MYSQLi 创建表

Matches

CREATE TABLE `matches` (

 `match_id` int(11) NOT NULL AUTO_INCREMENT,

 `match_date` date NOT NULL,

 `match_name` varchar(50) NOT NULL,

 `base_result` varchar(50) NOT NULL,

 `specific_result` varchar(50) NOT NULL,

 `super_specific_result` varchar(50) NOT NULL,

 `sport_id` int(11) NOT NULL,

 `organisation_id` int(11) NOT NULL,

 PRIMARY KEY (`match_id`),

 KEY `match_date` (`match_date`),

 KEY `match_name` (`match_name`),

 KEY `sport_id` (`sport_id`),

 KEY `organisation_id` (`organisation_id`),

 KEY `base_result` (`base_result`) USING BTREE,

 KEY `specific_result` (`specific_result`) USING BTREE,

 KEY `super_specific_result` (`super_specific_result`) USING BTREE,

 CONSTRAINT `matches_ibfk_1` FOREIGN KEY (`organisation_id`) REFERENCES `organisation` (`organisation_id`),

 CONSTRAINT `matches_ibfk_2` FOREIGN KEY (`sport_id`) REFERENCES `sports` (`sport_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

Predictors

CREATE TABLE `predictors` (

 `predictor_id` int(11) 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=latin1

Predictions

CREATE TABLE `predictions` (

 `prediction_id` int(11) NOT NULL,

 `match_id` int(11) NOT NULL,

 `predictor_id` int(11) NOT NULL,

 `base_prediction` varchar(50) NOT NULL,

 `specific_prediction` varchar(50) NOT NULL,

 `super_specific_prediction` varchar(50) NOT NULL,

 PRIMARY KEY (`prediction_id`),

 KEY `match_id` (`match_id`),

 KEY `predictor_id` (`predictor_id`),

 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 DEFAULT CHARSET=latin1

【问题讨论】:

  • 您能否创建一个dbfiddle 并包含一个最小样本数据和与此相对应的预期结果。您是否有意在if 语句中使用赋值=/= 运算符?如果这是一个 1-> many join(至少在匹配上),是否缺少 group by
  • 嗨,你是对的,我使用 = 而不是 === 和 /= 而不是 !== 使用了错误的匹配语法,我现在已经在问题中编辑了这个。您将如何在此中设置 group by 语句。我对那个 dbfiddle 网站有点迷茫,不知道从哪里开始。

标签: php html mysql


【解决方案1】:

使用您的 SQL,您希望 GROUP BY predictor_id 因此每行只有 1 个预测器。之后,您可以使用 SQL SUM 将匹配结果相加。 SQL 中的= 是一个比较结果,0 表示假,1 表示真。因此,只需将这些相加即可获得总赢/输。

SELECT predictors.predictor_id,
       predictors.predictor_name,
       SUM(matches.base_result = predictions.base_prediction) as WINS
       SUM(matches.base_result != predictions.base_prediction) as LOSSES  
FROM predictions 
INNER JOIN matches ON matches.match_id = predictions.match_id
INNER JOIN predictors ON predictors.predictor_id = predictions.predictor_id
GROUP BY predictions.predictor_id

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2013-02-18
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多