如何查询第一个和最后一个日期

问题描述 投票:0回答:1

我正在查询野生动物目击数据库,以显示基于查询字符串'yr'AS Dingy_Skipper_FDate的第一次看到Dingy_Skipper。我想显示同一个查询字符串'yr'AS Dingy_Skipper_LDate的最后/最新目击事件

我认为我需要使用UNION,但我已经尝试了几次,似乎无法让它工作。我以前从未使用过UNION,所以任何帮助都会得到赞赏。非常感谢您提前!

我尝试了以下查询,但这会在$ Dingy_Skipper1 = $ sp1-> query($ Dingy_Skipper);行上产生错误。

<?php
// connect
$sp1 = dbConnect('read', 'pdo');
// prepare query
$theyear = $_GET['yr'];
$Dingy_Skipper = "
SELECT rDate AS Dingy_Skipper_FDate, Dingy_Skipper
FROM wbcrecords
WHERE YEAR(rDate) = '$theyear' AND Dingy_Skipper >='1' ORDER BY rDate ASC Limit 1
UNION
SELECT rDate AS Dingy_Skipper_LDate, Dingy_Skipper
FROM wbcrecords
WHERE YEAR(rDate) = '$theyear' AND Dingy_Skipper >='1' ORDER BY rDate DESC Limit 1";
// submit query capture result
$Dingy_Skipper1 = $sp1->query($Dingy_Skipper);
// free database
$Dingy_Skipper1->closeCursor();
?>

我已经更新了现在正常工作的查询(见下文),并且我认为可以防止SQL注入?但是,从同一个表中的第二列中选择第一个和最后一个日期的最有效方法是Grizzled_Skipper,因此我的第一个和最后一个日期为Grizzled_Skipper列的$ Grizzled_Skipper_FDate和$ Grizzled_Skipper_LDate以及$ Dingy_Skipper_FDate和$ Dingy_Skipper_LDate为Dingy_Skipper列?

<?php
if (isset($_GET['yr'])) {
require_once('inc/connection.php');
$conn = dbConnect('read', 'pdo');
$sql = 'SELECT MIN(rDate) AS Dingy_Skipper_FDate, MAX(rDate) AS Dingy_Skipper_LDate, Dingy_Skipper
FROM wbcrecords
WHERE YEAR(rDate) = :yr AND Dingy_Skipper >="1"';
$searchterm = $_GET['yr'];
$Species = $conn->prepare($sql);
$Species->bindParam(':yr', $searchterm, PDO::PARAM_STR);
$Species->bindColumn(1, $Dingy_Skipper_FDate);
$Species->bindColumn(2, $Dingy_Skipper_LDate);
$Species->bindColumn(3, $Dingy_Skipper);
$Species->execute();
$numRows = $Species->rowCount();
}
?>
php mysql pdo union
1个回答
0
投票

你可能会使用MIN()和MAX()得到这个,如下所示:

  SELECT MIN(rDate) AS Dingy_Skipper_FDate,
         MAX(rDate) AS Dingy_Skipper_LDate, 
         Dingy_Skipper
    FROM wbcrecords
   WHERE YEAR(rDate) = '$theyear' 
     AND Dingy_Skipper >='1'
GROUP BY Dingy_Skipper

请务必转义您在此查询中使用的变量。否则,您对SQL注入攻击持开放态度。

编辑:您最好使用预准备语句并使用$theyear变量作为参数,而不是转义。

© www.soinside.com 2019 - 2024. All rights reserved.