sql - 如何选择非付费用户?
问题描述
我想选择没有任何订单或没有任何“付费”订单的用户:
SELECT "users".*
FROM "users"
LEFT OUTER JOIN orders ON orders.user_id=users.id
WHERE (NOT (orders.state = 'paid'))
这只会返回尚未支付订单的用户,而忽略没有订单的用户。
我该如何纠正?
解决方案
这是逻辑:
SELECT u.*
FROM "users" u LEFT JOIN
orders o
ON o.user_id = u.id AND o.state = 'paid' -- match on "paid"
WHERE o.user_id IS NULL; -- return without a match
使用以下方法可能会更好地理解这一点NOT EXISTS
:
SELECT u.*
FROM "users" u
WHERE NOT EXISTS (SELECT 1 -- the following does not exist
FROM orders o
WHERE o.user_id = u.id AND -- match on the user
o.state = 'paid' -- match paid state
);
推荐阅读
- ruby - _posts 的 Jekyll 集合未在 _site 上呈现
- r - dplyr 的新数据列表和函数
- node.js - 在 Cent OS 上安装 React JS
- r - 如何使用 e_tooltip_pie_formatter 转换为工具提示中的百分比?
- python - “if False: from typing import Type”是什么意思?
- python - 在python的数据框中找不到项目
- google-chrome - chrome开发工具中的覆盖选项卡,它不会用绿色突出显示加载的css,用红色突出显示未使用的css
- python - 让 Xcode 在项目中运行当前 Python 文件
- ruby-on-rails - 将 Facebook 登录集成到 Rails 6(或 5)应用程序的简单方法是什么?
- python - 使用urllib2在python中发送json数据时如何避免rabbit mq中的坏地图错误