【问题标题】:PHP/SQL - Return boolean result from SQL query between two datesPHP/SQL - 从两个日期之间的 SQL 查询返回布尔结果
【发布时间】:2015-05-27 23:38:58
【问题描述】:

有人要求我构建一个调度程序,以根据开始/结束日期在网站上显示特别优惠。其中一部分是如果有有效的报价,则有条件地显示指向该页面的链接。但我完全不知所措。

以下查询获取正确日期内的所有当前报价:

$now = date('Y-m-j');
$sql = "SELECT * FROM sample WHERE date_from <= '".$now."' AND date_to > '".$now."'";

我无法开发此查询以返回 TRUE/FALSE 值(现有导航结构需要该值 - 由另一位开发人员创建)。有一些帖子声明在现有查询上使用 EXISTS() 或 SELECT CASE WHEN EXISTS(),然后是 THEN/ELSE 作为输出。但经过数小时尝试破解此问题后,我只设法获得了错误。

我知道有可能解决这个问题,但我想从 SQL 查询本身返回一个布尔值。

【问题讨论】:

  • 如果该查询返回 1 行或更多行,您想要 true 吗?
  • 类似:SELECT COUNT(1) is_exists FROM sample WHERE date_from '".$now."
  • 是的,Dagon,如果至少返回一行,就会有报价,所以“TRUE”显示导航。
  • 以我为例: if ($row->is_exists > 0) { ...
  • 太棒了,请参阅下面的答案。接近尾声时,我提到了 *_num_rows() php 函数。根据您的数据库,您可以请求查询返回的行数。那么就没有必要只做简单的额外逻辑 if( pg_num_rows($res) > 0 ) {stuff;}

标签: php mysql sql-server boolean


【解决方案1】:

案例应该有效:

select
CASE 
  WHEN date_from <= '".$now."' AND date_to > '".$now."' THEN 'TRUE'
  ELSE 'FALSE'
END

from yourtable 

也许更好

SELECT exists (
  SELECT * FROM sample WHERE date_from <= '".$now."' AND date_to > '".$now."') as BOO

如果有匹配,BOO 将为 1

【讨论】:

  • 如何从该查询中检索结果?
  • 这行得通,但如果至少有一个为真,我需要返回一个简单的真或假。这是我的问题的最后一部分。
  • LIMIT 1 with give you one true\false
【解决方案2】:

PHP 数据库查询将资源返回到查询结果。 结果是 select 语句返回的元素的数组或对象。

如果你想从 sql 查询本身返回一个布尔值。然后,您必须将 *(星号)更改为布尔值。

根据您使用的数据库,可用的确切语法和功能会发生变化。但是让我们假设 microsoft sql 或 postgres..

Postgres:

$sql = "SELECT (count(*)>0) as bool_result FROM sample WHERE date_from <= '".$now."' AND date_to > '".$now."'";

微软 SQL:

$sql = "SELECT (case when count(*)>0 then 1 else 0 end) as int_result FROM sample WHERE date_from <= '".$now."' AND date_to > '".$now."'";

Microsoft SQL 使用小整数或位表示布尔值。所以没有办法返回严格意义上的“布尔值”。因此,布尔比较中 1 或 0 的结构时的情况。

如果您想知道是否返回了 ANY 行并且您不在乎结果集,那么 mssql_num_rows 或 pg_num_rows 可能更适合您的答案。两者都返回查询结果集中的行数。然后,您可以将其与等于 0 或 1 进行比较。

这与您在不提供代码示例和更多详细信息的情况下可以获得的答案差不多。

这是一个例子:

$sql = "SELECT * FROM sample WHERE date_from <= '".$now."' AND date_to > '".$now."'";
$res = pg_query($sql);
if( pg_num_rows($res) > 0 ) 
    ShowNav();

【讨论】:

  • 我认为 OP 应该检查他的查询是否返回任何结果,例如 $rowcount=mysqli_num_rows($result);,然后是 if($rowcount == 0){ //false...}else{//true..}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 2018-07-25
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多