SQL:如何根据类别进行选择?

2024-04-06

有两张桌子,categories and books我想根据给定的类别选择所有书籍。

类别表:

cat_id | book_id
----------------
1      | 1
2      | 1
3      | 1
3      | 2

图书表:

id  | name
----------------
1   | abc
2   | def

我试过了SELECT * FROM categories WHERE cat_id IN(1,3)但随后它会返回至少包含给定类别之一的书籍。我想要的是它只返回包含所有类别的书籍,因此它应该只返回 book_id = 1 的所有(或一个)行,因为它是唯一具有所有给定类别的书籍。


Try:

select book_id
from categories
group by book_id
having sum( ( cat_id in (1,3) )::int ) = 2

或者,如果您打算从支持直接向其传递数组的语言将数组传递给 postgres(如下所示:http://fxjr.blogspot.com/2009/05/npgsql-tips-using-in-queries-with.html http://fxjr.blogspot.com/2009/05/npgsql-tips-using-in-queries-with.html), 用这个:

select book_id
from categories
group by book_id
having sum( ( cat_id = ANY(ARRAY[1,3]) )::int ) = 2

如果你想获取书名:

select categories.book_id, books.name
from categories
join books on books.id = categories.book_id
group by categories.book_id
    ,books.name
having sum( ( categories.cat_id in (1,3) )::int ) = 2

@Evan Carroll,修改查询:

ANSI SQL方式:

select categories.book_id, books.name
from categories
join books on books.id = categories.book_id
group by categories.book_id
    ,books.name
having count(case when categories.cat_id in (1,3) then 1 end) = 2

无书名:

select book_id
from categories
group by book_id
having count( case when cat_id in (1,3) then 1 end ) = 2

在同一子句中内联条件及其计数值有什么好处(即having)而不是单独将条件放入where子句及其计数having条款?...

select book_id
from categories
where category_id in (1,3)
group by book_id
having count(*) = 2

...如果我们将条件及其计数值内联having条款,我们可以方便地进行查询列出类别为 1 和 3,或类别为 2、3 和 4 的所有书籍。面向未来的 FTW!另外,组合类别的测试及其计数是彼此相邻的,再加上可读性方面的因素。

为了方便这种查询:

select book_id
from categories
group by book_id
having 
    count( case when cat_id in (1,3) then 1 end ) = 2 
    or count( case when cat_id in (2,3,4) then 1 end ) = 3

为了实现性能(有时,同时实现性能和可读性;不要混合得很好),must将having子句的元素测试复制到where子句:

select book_id
from categories
where cat_id in (1,2,3,4)
group by book_id
having 
    count( case when cat_id in (1,3) then 1 end ) = 2 
    or count( case when cat_id in (2,3,4) then 1 end ) = 3

[EDIT]

顺便说一句,这是惯用的 MySQL:

select book_id
from categories
group by book_id
having sum( cat_id in (1,3) ) = 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL:如何根据类别进行选择? 的相关文章

随机推荐

  • 添加样式以回显[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想为这个 php echo 添加一
  • 如何从 javascript 数组推送 JSON 中的元素

    我想将 javascript 数组值添加到 JSON 值对象中 其他元素也替换了我的元素 如收件人 主题 消息 我得到的 Json 如下 下面是我的代码 var BODY recipients values subject title bo
  • 在 MySQL 中获取下个月的第一个和最后一个日期

    如何在 where 子句中使用下个月的第一天和最后一天 Use SELECT DATE SUB LAST DAY DATE ADD NOW INTERVAL 1 MONTH INTERVAL DAY LAST DAY DATE ADD NO
  • FileOutputstream.close() 并不总是将字节写入文件系统?

    看完之后这个答案 https stackoverflow com questions 7849528 fileoutputstream close is really slow when writing large file 7849941
  • 设置 WebRequest 的正文数据

    我正在 ASP NET 中创建一个 Web 请求 我需要向正文添加一堆数据 我怎么做 var request HttpWebRequest Create targetURL request Method PUT response HttpW
  • GitHub 的 GPG 公钥是什么?

    如果您通过 GitHub 网站进行编辑 或合并拉取请求 则生成的提交将自动使用 GitHub 的 GPG 密钥进行签名 它看起来像这样 我希望拥有完整的公钥 以便我可以将其添加为我的系统上的可信密钥 GitHub 的 GPG 公钥是什么 G
  • 在 Windows 记事本的 Python 中创建 UTF-16 换行符

    在 Ubuntu 中运行的 Python 2 7 中 这段代码 f open testfile txt w f write Line one encode utf 16 f write u r n encode utf 16 f write
  • HTML LocalStorage 中的数据在其他窗口/选项卡中可用所需的时间

    我有一个使用 HTML LocalStorage 的网页 同时打开此页面的多个选项卡 窗口是很常见的 由于这些都使用相同的 LocalStorage 并且 LocalStorage 不提供事务或类似功能 因此我想实现某种形式的互斥 以防止不
  • 我如何将变量传递给谷歌云函数

    我目前正在创建一个云任务 它将定期将新数据导入到 automl 数据集中 目标是 GCP 云函数 http 目标 因为我不想在云函数中对数据集 ID 进行硬编码 我希望它接受来自 Web UI 的数据集 ID 因此我用这种方式输入flask
  • Ionic 本机 Google 地图 Android 无法正常工作

    我必须在我的项目中添加带有 Google 地图的视图 我跟着官方 ionic 本机 Google 地图文档 https ionicframework com docs native google maps 但它不起作用 我将背景颜色粉红色分
  • Hibernate:如何进行 EXISTS 查询? (不是子查询)

    例如 EXISTS SELECT FROM table WHERE 如何使用 Hibernate 进行这样的查询 HQL不允许使用exists陈述 UPD从 Hibernate 5 开始它支持将其作为 WHERE 中的谓词 https do
  • $this 关键字的含义是什么?

    请解释一下这是为了什么 this and gt 代表 让我们以下面的代码为例 this gt convertNamesToCaptions order formId this 指的是当前对象 手册说 当从对象上下文中调用方法时 伪变量 th
  • Ruby 代码块与 javascript 匿名函数的区别

    我正在做我的第一次实习 一切进展顺利 我正在努力跟上其他程序员谈论的一切 有一天 一位高级程序员告诉我 Ruby 将代码块直接传递给函数的能力比在 JavaScript 中使用匿名函数要好得多 据我了解 JS 匿名函数完全相同 只是通过变量
  • 为什么链表使用指针而不是在节点内存储节点

    我之前在 Java 中广泛使用过链表 但我对 C 还很陌生 我正在使用项目中提供给我的这个节点类 效果很好 class Node public Node int data int m data Node m next 但我有一个问题没有得到
  • Python不创建日志文件

    我正在尝试实现一些日志记录来记录消息 我遇到了一些奇怪的行为 所以我试图找到一个最小的例子 我发现了here https docs python org 2 howto logging html logging to a file 当我将其
  • 删除JSF数据表行(来自不同数据库的行中的列)

    我有一个 JSF 数据表 它有三列 分别是 Work Type Desc Project Phase 和 Activity Desc 这些列来自两个不同的数据库表 这两个表的关系是一对多的 第一个表名称是 Work Type 它具有 1 W
  • 是否有更优雅的方法将不规则的数据转换为整洁的数据框

    我有一个数据框 其中包含一列参差不齐的数据 主题 其中每个主题都是一串字符 相邻主题之间用分隔符 本例中为 分隔 library lubridate events lt data frame date dmy c 12 6 2012 13
  • 如何从 QTreeview 中删除所有行和子行

    我不知道为什么我无法从 qtreeview 中删除所有行和子行 我使用 QStandardItemModel 作为模型 现在这是我的代码不起作用 可能是什么问题呢 QModelIndex FirstQModelIndex QModelInd
  • golang Reflect 获取闭包函数指针

    请检查代码 package main import fmt reflect func main factory func name string func return func fmt Println name f1 factory f1
  • SQL:如何根据类别进行选择?

    有两张桌子 categories and books我想根据给定的类别选择所有书籍 类别表 cat id book id 1 1 2 1 3 1 3 2 图书表 id name 1 abc 2 def 我试过了SELECT FROM cat