GVKun编程网logo

Zend_Db使用多个AND OR运算符的复杂WHERE子句(where多个值)

29

对于想了解Zend_Db使用多个ANDOR运算符的复杂WHERE子句的读者,本文将是一篇不可错过的文章,我们将详细介绍where多个值,并且为您提供关于AndroidORMLite.左加入.WHERE

对于想了解Zend_Db使用多个AND OR运算符的复杂WHERE子句的读者,本文将是一篇不可错过的文章,我们将详细介绍where多个值,并且为您提供关于Android ORMLite.左加入. WHERE子句、android – 使用带有OR运算符的多个标记使用全文搜索(FTS)在多列中搜索、Firestore:多个条件where子句、mysql – 如何在带有可选include的where子句中使用运算符?的有价值信息。

本文目录一览:

Zend_Db使用多个AND OR运算符的复杂WHERE子句(where多个值)

Zend_Db使用多个AND OR运算符的复杂WHERE子句(where多个值)

我想在Zend_Db中生成这个复杂的WHERE子句:

SELECT * FROM ''products'' WHERE     status = ''active''     AND     (        attribute = ''one''         OR         attribute = ''two''         OR         [...]    );

我已经试过了:

$select->from(''product'');$select->where(''status = ?'', $status);$select->where(''attribute = ?'', $a1);$select->orWhere(''attribute = ?'', $a2);

并且产生了:

SELECT `product`.* FROM `product` WHERE     (status = ''active'')     AND     (attribute = ''one'')     OR     (attribute = ''two'');

我确实找到了一种完成这项工作的方法,但是我觉得通过使用PHP先组合“ OR”子句,然后再使用Zend_Db
where()子句将它们组合起来,这是一种“欺骗”。PHP代码:

$WHERE = array();foreach($attributes as $a):    #WHERE[] = "attribute = ''" . $a . "''";endforeach;$WHERE = implode('' OR '', $WHERE);$select->from(''product'');$select->where(''status = ?'', $status);$select->where($WHERE);

产生了我想要的东西。但是我很好奇,是否有一种“官方”方式可以通过使用Zend_Db工具来获取复杂的WHERE语句(实际上并不太复杂,只需添加一些括号),而不是先在PHP中进行组合。

干杯!

答案1

小编典典

这将是为您提供指定括号的“官方”方式(请参见Zend_Db_Select文档中的示例20
):

$a1 = ''one'';$a2 = ''two'';$select->from(''product'');$select->where(''status = ?'', $status);$select->where("attribute = $a1 OR attribute = $a2");

因此,鉴于您不知道自己提前拥有多少个属性,因此您所做的事情似乎很合理。

Android ORMLite.左加入. WHERE子句

Android ORMLite.左加入. WHERE子句

QueryBuilder<Answer,Integer> queryBuilder = helper.getAnswerDao().queryBuilder();
QueryBuilder<Question,Integer> questionQueryBuilder = helper.getQuestionDao().queryBuilder();

questionQueryBuilder.where().eq(Question.TYPE_COLUMN_NAME,"table");            
queryBuilder.leftJoin(questionQueryBuilder);

queryBuilder.where().eq(Answer.PICKED_COLUMN_NAME,true);

pickedAnswers = queryBuilder.query();

生成的sql语句:

SELECT `Answers`.* 
FROM `Answers`
    LEFT JOIN `Questions` ON `Answers`.`questionId` = `Questions`.`id`
WHERE `Answers`.`picked` = 1
    AND (`Questions`.`type` = ''table'' )

由于“AND”逻辑运算,此查询返回空结果集.这是Ormlite的默认行为.是否有可能改变“OR”操作与子句结合的地方?

我试过:queryBuilder.where().或()之前的queryBuilder.where().eq(Answer.PICKED_COLUMN_NAME,true)和queryBuilder.where().或者(2)之后的所有where()方法.

解决方法

有leftJoinor方法,它完全符合我的需要.它使用OR逻辑运算构建where子句.

android – 使用带有OR运算符的多个标记使用全文搜索(FTS)在多列中搜索

android – 使用带有OR运算符的多个标记使用全文搜索(FTS)在多列中搜索

我正在使用FTS查询我的数据库以提高搜索速度,因为我还需要在文本描述中搜索,

当我尝试使用单列查询时,其工作正常,如下所示

select * from productsearch where productsearch match ('prod_name:panasonic*tw*')

并且,

select * from productsearch where productsearch match ('prod_short_desc:samsung*s5*')

因此,在两个查询之上给出了我预期的结果,但是当我尝试使用OR运算符组合两个查询时它没有给我任何结果

select * from productsearch where productsearch match ('prod_name:panasonic*tw* OR
                                                         prod_short_desc:samsung*s5*')

所以,我想知道在使用OR运算符搜索多个列时我是否在做错了什么

UPDATE

以下查询工作正常,但不符合我的要求,

select * from productsearch where productsearch match ('prod_name:panasonic* OR 
                                                            prod_short_desc:samsung*')

您可以看到,如果我删除多个令牌,那么它也可以使用OR运算符正常工作.

解决方法

sqlite的FTS仅支持简单的前缀搜索.

像prod_short_desc:samsung * s5 *这样的查询由两个表达式组成,prod_short_desc:samsung *和s5 *,其行为与编写prod_short_desc:samsung * s5 *完全相同.

如果已经为增强的查询语法编译了sqlite,则可以使用如下查询:

prod_short_desc:samsung* prod_short_desc:s5* OR prod_name:panasonic* prod_name:tw*

如果已为标准查询语法编译sqlite,则不能对此使用单个查询,因为OR运算符的优先级太高而无法使用括号修改.

Firestore:多个条件where子句

Firestore:多个条件where子句

例如,我对我的书籍清单有动态过滤器,可以在其中设置特定的颜色,作者和类别。该过滤器可以一次设置多种颜色,也可以设置多种类别。

   Book > Red,Blue > Adventure,Detective.

如何有条件地添加“ where”?

  firebase
    .firestore()
    .collection("book")
    .where("category","==",)
    .where("color",)
    .where("author",)

    .orderBy("date")
    .get()
    .then(querySnapshot => {...

mysql – 如何在带有可选include的where子句中使用运算符?

mysql – 如何在带有可选include的where子句中使用运算符?

我有以下型号:

AuthorModel.hasMany(BookModel);
BookModel.belongsTo(AuthorModel);

有些作者没有书.

我想选择一个作者,他的一本书的名字或头衔与搜索字符串相匹配.

我可以通过以下声明来实现这一点,但仅限于在BookModel中拥有书籍的作者

       Author.findOne({
         include: [{
            model: Book,where: {
              [Op.or]: [
                  {'$author.name$': 'search string'},{ title: 'search string'}
                 ]
               },}]
           })

这给了我或多或少的以下mySQL查询:

SELECT 
    `author`.`name`,`book`.`title`
FROM `author` INNER JOIN `book` 
     ON `author`.`id` = `book`.`authorId`
     AND ( `author`.`name` = 'search string' OR `book`.`title` = 'search string');

这里的问题是,如果作者没有书籍,那么结果是空的.即使有作者符合搜索条件.

我试图将include设置为required:false,它给出了一个左外连接.在这种情况下,我得到一些不匹配的结果.省略了where子句.

我如何更改我的sequelize查询,或者什么是正确的mySQL查询?

最佳答案
MySQL查询可能应该是这样的

SELECT 
    `author`.`name`,`book`.`title`
FROM `author` LEFT JOIN `book` 
     ON `author`.`id` = `book`.`authorId`
WHERE ( `author`.`name` = 'search string' OR `book`.`title` = 'search string')

注意这里的过滤条件是如何在WHERE而不是JOIN … ON子句的一部分

基于Top level where with eagerly loaded models的示例,你的squizzle查询可能应该是这样的

Author.findOne({
    where: {
          [Op.or]: [
              {'$author.name$': 'search string'},{ '$Book.title$': 'search string'}
             ]
           },include: [{
        model: Book,required: false
       }]})

我们今天的关于Zend_Db使用多个AND OR运算符的复杂WHERE子句where多个值的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android ORMLite.左加入. WHERE子句、android – 使用带有OR运算符的多个标记使用全文搜索(FTS)在多列中搜索、Firestore:多个条件where子句、mysql – 如何在带有可选include的where子句中使用运算符?的相关信息,请在本站查询。

本文标签: