“没有选择的地方(选择......)”? -- 7 领域 和 database 领域 drupal 相关 的问题

“WHERE NOT IN ( SELECT… )” with SelectQuery?


6
vote

问题

中文

是否可以将 WHERE NOT IN (SELECT...) WHERE NOT IN (SELECT...) SelectQuery 对象添加?我正在看 selectquery ::条件(),它似乎没有允许此语法:

  public SelectQuery::condition($field, $value = NULL, $operator = NULL)   

似乎只允许价值比较表达式。是否有另一种方法提供此语法?

我正在查看数千个值的条件,所以似乎有一堆 AND value <> x 条件。

英文原文

Is it possible to add a WHERE NOT IN (SELECT...) clause to a SelectQuery object? I was looking at SelectQuery::condition(), and it doesn't seem to allow for this syntax:

public SelectQuery::condition($field, $value = NULL, $operator = NULL) 

It only seems to allow for value comparison expressions. Is there another method that provides this syntax?

I'm looking at conditions on the order of thousands of values, so it seems inefficient to have a bunch of AND value <> x conditions.

     

回答列表

8
 
vote
vote
最佳答案
 

您正在寻找的是 SelectQuery :: Asists(),不幸的是,它似乎并没有与"常用方式" 一起制造这样的子句:
通常在 EXISTS 条文中,您将在子查询之外的表中放入如下所示:

  SELECT n.nid FROM node n WHERE EXISTS (   SELECT NULL   FROM users u   WHERE u.uid = n.uid   AND u.status = 0)   

返回阻塞用户的节点(是的,可以轻松地构建 EXISTS ,但它是为了教学目的;)。

这里的问题是 exists 条件不支持"外部链接" , u.uid = n.uid 部分,所以你必须建立一个完全独立的查询,这不是非常的高效恕我直言。
在Drupal中,您将写下:

  $query = db_select('node', 'n')   ->fields('n', array('nid')); $subquery = db_select('node', 'n2')   ->fields('n2', array('nid'))   ->join('users', 'u', 'n2.uid = u.uid'   ->condition('u.status', 0); $query->condition('', $subquery, 'EXISTS'); $result = $query->execute();   

您也可以使用 db_query()就像在Drupal 6和当然 selectquery :: notexists()可用。

 

What you're looking for is SelectQuery::exists(), unfortunately it doesn't seems to work with "common way" to build such clause:
Normally in a EXISTS clause you put a JOIN on tables outside of your sub query like this:

SELECT n.nid FROM node n WHERE EXISTS (   SELECT NULL   FROM users u   WHERE u.uid = n.uid   AND u.status = 0) 

This returns the nodes of blocked users (yes it can be built easily without the EXISTS but it's for teaching purposes ;).

The problem here is that the exists condition doesn't support "outside linking", the u.uid = n.uid part so you have to build a completely independent query which is not very efficient IMHO.
In Drupal you will write this:

$query = db_select('node', 'n')   ->fields('n', array('nid')); $subquery = db_select('node', 'n2')   ->fields('n2', array('nid'))   ->join('users', 'u', 'n2.uid = u.uid'   ->condition('u.status', 0); $query->condition('', $subquery, 'EXISTS'); $result = $query->execute(); 

You can also use db_query() like you used to do in Drupal 6 and of course SelectQuery::notExists() is available.

 
 
2
 
vote

使用NOT在子选择中使用DB_SELECT的更简单的方法只是为了使用

$ query-&gt ;其中

在条件下添加任意条件。

e.g:

    // Count query for users without rid 3   $query = db_select('users', 'u');   $query->fields('u', array('uid'));   $query->where('u.uid NOT IN(select uid from {users_roles} where rid = :rid)', array(':rid' => 3));     $result = $query->countQuery()->execute()->fetchField();   drupal_set_message($result);   
 

An easier way to use db_select with a NOT IN subselect is just to use

$query->where

to add an arbitrary where condition.

e.g:

  // Count query for users without rid 3   $query = db_select('users', 'u');   $query->fields('u', array('uid'));   $query->where('u.uid NOT IN(select uid from {users_roles} where rid = :rid)', array(':rid' => 3));     $result = $query->countQuery()->execute()->fetchField();   drupal_set_message($result); 
 
 
 
 
2
 
vote

%,你 can 使用 selectquery :: condition()用于创建Supelects:

  $query = db_select('users', 'u')   ->fields('u', array('uid'))   ->condition('u.uid', db_select('users_roles', 'r')->fields('r', array('uid')), 'NOT IN');   

如果我们使用devel的dpq()函数打印此查询,它将输出:

  SELECT u.uid AS uid FROM  {users} u WHERE  (u.uid NOT IN  (SELECT r.uid AS uid FROM  {users_roles} r))   

我希望这有帮助; - )

 

Acutally, you can use SelectQuery::condition() for creating subselects like so:

$query = db_select('users', 'u')   ->fields('u', array('uid'))   ->condition('u.uid', db_select('users_roles', 'r')->fields('r', array('uid')), 'NOT IN'); 

If we print this query using the dpq() function of devel it will output:

SELECT u.uid AS uid FROM  {users} u WHERE  (u.uid NOT IN  (SELECT r.uid AS uid FROM  {users_roles} r)) 

I hope this helps ;-)

 
 
0
 
vote

我相信这会帮助你。

  $query->where('n.nid NOT IN (:nids)', array(     ':nids' => implode(',', $nids) ));   
 

I believe this would help you.

$query->where('n.nid NOT IN (:nids)', array(     ':nids' => implode(',', $nids) )); 
 
 

相关问题

2  用户级权限是否有模块?  ( Is there a module for user level permissions ) 
我知道权限由管理员控制。我希望定期用户来控制不同的权限集,例如我的用户将有图片,朋友列表,在那里的个人信息。我希望它们能够创建组并限制访问,因此某些组可以看到某些内容。是否有一个模块,或者我需要被大男孩涂料放在上面并开始编码吗? ...

2  查看Null值的上下文过滤器  ( Views contextual filters for null value ) 
如何使用上下文过滤器查找具有空值的字段_abc的所有节点? ...

2  定义新图像样式的图像裁剪  ( Define image cropping in new image style ) 
在创建新的图像样式时,是否有一个模块,可以让您定义开始裁剪的位置?我认为Drupal只有来自中心的作物。如果是这个特定的图像,我希望裁剪从左上方的裁剪?或者更好,提供一些GUI,可以让我在FB中手动裁剪区域。 ...

2  视图的模板?  ( Template for a view ) 
我创建了一个在 http://mysite.com/branch-locator 上可查看的视图。 view是由我的page.tpl.php显示的。如何覆盖此并使用名为BranchLocator.tpl.php的新模板文件来显示我的视图? ...

0  如何强制面包屑使用主菜单以外的菜单?  ( How do i force breadcrumb to use a menu other than main menu ) 
我正在尝试强制面包屑遵循主菜单以外的菜单的结构。 我已配置内容类型以使用新菜单添加链接,这些链接在侧栏菜单中正确显示。然而,面包屑只会显示家庭&gt; (current_page)。 这个配置在哪里?是硬编码吗? 任何建议都赞赏。 欢呼声 保罗 ...

0  查看仅显示有特定日期的内容?  ( View that only shows content that have a certain date ) 
我有一个观点,我正在使用列出事件,特别是"今天的事件" 。创建它相对容易,说我希望它按时间划分,但我想知道,是如何才能将其过滤到仅显示它正在显示的日期发生的事件。我正在使用日期模块的CCK才能创建日期。我假设我会使用日期开始时间,但我无法弄清楚如何过滤该开始日期。 ...

0  D7每个用户唯一页面/配置文件  ( D7 unique page profile per user ) 
我在很多方面工作,看法和面板来解决这个问题,但我不能。 当用户注册帐户时,我希望他能够让每个人都可以看到自己的个人资料。 配置文件是1页用户可以使用自定义内容类型创建(也许有更好的东西使用?)与分类词学词汇,随机文本,图库和日历中的信息。 由于在几个步骤中,我希望写入很多信息。 所以我想划分几个地区的页面,对所有用户...

1  在D7中的自动输出存在哪些替代方案  ( What alternatives exist for autologout in d7 ) 
自自动启动模块没有准备好D7的Prime时间,那里有一些替代品? 已经有任何片段,可以在样品自定义模块中使用,该模块将为X分钟不活动注销用户? 更新1 : 建议片段在这里保持d7崩溃,但没有注销用户。 谢谢! ...

0  在Drupal 7中发出条件重定向  ( Issue a conditional redirect in drupal 7 ) 
我有一种自定义付款表单,可以将"谢谢" 成功的页面重定向。页面只是一个页面类型节点,因此有人可以控制页面的内容。 我想做的是添加了一点额外的,除非他们刚刚来自表格,否则可以看到页面。 我尝试使用3个功能。 hook_node_view,hook_node_view_alter和hook_init。 我认为前两个将允许...

4  如何使用WYSIWYG + CKEDITOR获得预告片段?  ( How to get teaser break to work with wysiwyg ckeditor ) 
我有drupal 7.7 + wysiwyg 7.x-2.1 + ckeditor 3.6.1安装。 我的目标是能够将一坯中断插入我的博客文章(博客后内容类型 - body字段),以便指定进入预告片的内容以及进入完整节点视图的内容。 当我单击CK编辑器菜单栏中的"单独分隔此内容的剪报器和正文" 按钮时,文本 <!-...

1  匿名可以访问当前节点吗?如何在我的模块中检查它?  ( Does anonymous can access current node how to check it in my module ) 
如果匿名用户可以查看此节点,我需要由我的模块做一些Witn当前节点。如何检查它? 默认情况下,我使用 $node->status == 1 ,但其他一些模块也可以改变发布的节点的匿名访问权限。 ...

1  使用视图显示选项卡,如“添加用户关系”,“发送消息”等  ( Use views to display tabs such as add user relationship send message etc ) 
在D7中,有一个模块,允许在视图中显示类似于以下内容的选项卡? 添加关系 编辑 消息 发送私信 我想将这些选项卡添加为视图块,因此我可以将它们放在我想要的地方。 ...

0  视图......两个窗格每个窗格都包含一个视图。一个是暴露过滤器,其他是字段。他们怎么能沟通?  ( Views two panes each contains a view one is the exposed filter other is th ) 
我有两个窗格,每个窗格包含一个视图。但是,这些视图是和公开的过滤器,它是字段/结果。如何互相意识到这些观点?我希望公开的过滤视图结果显示在其他字段窗格中。 我假设这将通过关系来完成。 ...

2  PHP代码上下文过滤器(参数)  ( Php code contextual filter arguments ) 
我尝试在drupal 7和视图3中显示具有公开过滤器的内容列表,我创建一个页面且它有效,但我还希望使用过滤器显示映射,因此我为gmap创建一个块为了获取有关过滤器的信息,我添加了一个使用这样的PHP代码的上下文过滤器(省份是字段的名称) return $_GET["province"]; 在drupal 6...

0  来自特定用户的最新推文(奖金:旋转幻灯片)  ( Latest tweets from a specific user bonus rotating slideshow ) 
我想从我的Twitter帐户中显示我的主页上的最新3推文。推文的旋转幻灯片会很酷,它看起来与Twitter模块有可能,但我无法完成工作。 我已经尝试了Twitter块(http://drupal.org/project/twitter_block),但这仍然是在开发的,似乎唯一没有使用它的东西是显示特定用户(这是我需...

2  如何使用XPathParser归因于术语参考字段来映射术语名称?  ( How to map term name via xpath node feed using xpathparser into term reference f ) 
我有一个xml effe导入到内容类型并映射到内容类型。但是,存在分类的领域。未引用的字段似乎正在运行正常并且正在拾取。但那些引用的分类词汇表单不是。 如何将数据从XML导入: <head>1 我希望能够将 <head>2 导入此内容类型,作为"Apartment" ,如分类词汇表中的"Apartment" ...

0  附加CSS阻止不起作用  ( Attaching css to block doesnt work ) 
mymodule在模块/自定义目录中。 $block['content']['#attached']['css'][] = drupal_get_path('module', 'mymodule' . '/mymodule.cs...

1  匿名可以访问当前节点吗?如何在我的模块中检查它?  ( Does anonymous can access current node how to check it in my module ) 
如果匿名用户可以查看此节点,我需要由我的模块做一些Witn当前节点。如何检查它? 默认情况下,我使用 $node->status == 1 ,但其他一些模块也可以改变发布的节点的匿名访问权限。 ...

1  Drupal中的WEBForm模块  ( Webform module in drupal ) 
我已经在Drupal网站中安装了WebForm模块,并希望配置它,以便提交限制是通过电子邮件而不是cookie。如果他们的电子邮件在系统中,我不希望已经提交两次提交两次的用户。有没有办法做到这一点?我必须为此创建一个新模块吗?如果是,我如何使用WebForm模块传达我的新模块?或者会编辑这个WebForm模块是解决方...

1  设置子域,在“settings.php”/“web.config”设置上混淆  ( Setting up subdomains confused on settings php web config setup ) 
首先,我正在使用共享托管。我已经设置了DNS,所以我有一个one.example.com,两个.example.com等。每个子域都正常工作,但它们使用默认的Page.tpl.php /看起来与我的首页完全相同。我假设下一步是配置settings.php,web.config,并创建预处理的主题钩。如何通过"子域" ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.