【问题标题】:SQL query with AND/OR logical operators使用 AND/OR 逻辑运算符的 SQL 查询
【发布时间】:2010-11-09 15:43:22
【问题描述】:

我有一个看似相对简单的 AND/OR 子句,这让我有点头疼。

$query = "SELECT stv.name,stc.tmplvarid,stc.contentid,stv.type,stv.display,stv.display_params,stc.value";
$query .= " FROM ".$tb1." stc LEFT JOIN ".$tb2." stv ON stv.id=stc.tmplvarid ";
$query .= " LEFT JOIN $tb_content tb_content ON stc.contentid=tb_content.id ";
$query .= " WHERE stv.name='".$region."' AND stc.contentid IN (".implode($cIDs,",").") ";
$query .= " OR stv.name='".$countries."' AND stc.contentid IN (".implode($cIDs,",").") ";
$query .= " AND tb_content.pub_date >= '$pub_date' ";
$query .= " AND tb_content.published = 1 ";
$query .= " ORDER BY stc.contentid ASC;";

我需要它从$region$countries 中检索值。但是,它的方式只返回$countries 的值。如果我删除带有OR 的行,它会返回$region 的值,但不会同时返回两者。我做错了什么?

【问题讨论】:

    标签: sql intersection logical-operators disjoint-union


    【解决方案1】:

    尝试在OR 两侧的子句周围加上括号。见下文:

    $query = "SELECT stv.name,stc.tmplvarid,stc.contentid,stv.type,stv.display,stv.display_params,stc.value"; 
    $query .= " FROM ".$tb1." stc LEFT JOIN ".$tb2." stv ON stv.id=stc.tmplvarid "; 
    $query .= " LEFT JOIN $tb_content tb_content ON stc.contentid=tb_content.id "; 
    $query .= " WHERE (stv.name='".$region."' AND stc.contentid IN (".implode($cIDs,",").")) "; 
    $query .= " OR (stv.name='".$countries."' AND stc.contentid IN (".implode($cIDs,",").")) "; 
    $query .= " AND tb_content.pub_date >= '$pub_date' "; 
    $query .= " AND tb_content.published = 1 "; 
    $query .= " ORDER BY stc.contentid ASC;"; 
    

    【讨论】:

    • 谢谢,但它仍然只返回 $countries。如果有帮助,这是完整的功能:pastebin.com/E4CdnQNj
    【解决方案2】:

    看起来你缺少括号,不是吗?

    A or B and C or D 有歧义,你需要用括号来说明你的意思是(A or B) and (C or D)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多