【问题标题】:PHP MySQL Order by Two Columns and limit by 1 result per first column [duplicate]PHP MySQL按两列排序,每第一列限制1个结果[重复]
【发布时间】:2018-12-27 13:19:06
【问题描述】:

你好,我有这张桌子:

CREATE TABLE `pupils` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`Name` varchar(24) NOT NULL DEFAULT '',
`Sex`  varchar(8) NOT NULL DEFAULT '',
`Age` SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;
INSERT INTO `pupils` VALUES ( DEFAULT, 'Tom', 'male', 12);
INSERT INTO `pupils` VALUES ( DEFAULT, 'Audrina', 'female', 17);
INSERT INTO `pupils` VALUES ( DEFAULT, 'Darnell', 'male', 15);
INSERT INTO `pupils` VALUES ( DEFAULT, 'Dana', 'female', 11);
INSERT INTO `pupils` VALUES ( DEFAULT, 'Roberta', 'female', 14);
INSERT INTO `pupils` VALUES ( DEFAULT, 'Walton', 'male', 14);

Мy 的目标是找到男女年龄最大的学生(这只是一个例子)。 我必须得到的结果如下:

Audrina
Darnell

我为此目的使用了这个 PHP 脚本:

<?php

include 'login.php';

function MySqlConnect( ) {
    global $host, $sql_username, $sql_password, $db_name;
    $con = new mysqli( $host, $sql_username, $sql_password, $db_name );
    if( $con->connect_errno ) { echo "ops1"; die( ); }
    return $con;
}

function GetNames( $con, &$all_names ) {
    global $tbl_pupils;
    if(!($result = $con->query( "SELECT Name,Sex FROM $tbl_pupils ORDER BY Sex,Age DESC" ) ) ) { echo "ops2"; die( ); }
    $names = [ ];
    while( $row = $result->fetch_row( ) ) {
        $curr_pupil = end( $names );
        if( !strcasecmp( $curr_pupil[1], $row[1] ) ) {
            $curr_pupil[0] = $row[0];
            $curr_pupil[1] = $row[1];
        } else {
            $names[ ] = array( $row[0], $row[1] );
        }
    }
    foreach( $names as &$curr_pupil ) $all_names[ ] = $curr_pupil[0];
    $result->free_result( );
}

$con = MySqlConnect( );
GetNames( $con, $all_names );
$con->close( );

foreach( $all_names as $name ) echo "$name<br>";

?>

我的问题是我可以创建一个 MySQL 查询来仅获取必要的两行结果吗?

【问题讨论】:

  • 试试SELECT Sex, Name, Age FROM pupils GROUP BY Sex ORDER BY Age DESC
  • 谢谢!我试了一下,得到了以下结果:Audrina Tom
  • 对不起,没用!
  • 如果有多个学生达到给定的最大年龄怎么办?比如,以你为例,沃尔顿是 15 岁,而不是 14 岁?
  • 它不会打扰我。例子很糟糕!事实上,我有超过 2 种性别。对不起,我不想在我的问题中提出第三性:(

标签: php mysql


【解决方案1】:

其中一种方式是union两个结果:

(SELECT * FROM `pupils` WHERE `Sex` = 'male' ORDER BY Age DESC LIMIT 1) 
UNION
(SELECT * FROM `pupils` WHERE `Sex` = 'female' ORDER BY Age DESC LIMIT 1)

演示here

【讨论】:

    【解决方案2】:

    试试这个 select name from pupils where age in (select max(age) from pupils group by sex);

    【讨论】:

      【解决方案3】:

      您可以使用两个单独查询的union

      (SELECT * FROM `pupils` WHERE `Sex` = 'male' ORDER BY `Age` DESC LIMIT 1) UNION (SELECT * FROM `pupils` WHERE `Sex` = 'female' ORDER BY `Age` DESC LIMIT 1);
      

      【讨论】:

        【解决方案4】:

        我想那会做到的:

        SELECT * FROM pupils as p1 
        WHERE p1.Sex='male' ORDER BY p1.Age DESC LIMIT 1
        UNION
        SELECT * FROM pupils as p2 
        WHERE p2.Sex='female' ORDER BY p2.Age DESC LIMIT 1
        

        【讨论】:

          猜你喜欢
          • 2016-03-02
          • 1970-01-01
          • 2022-01-04
          • 2016-07-19
          • 1970-01-01
          • 2015-04-25
          • 2016-11-07
          • 2022-01-11
          • 2018-03-14
          相关资源
          最近更新 更多