如何在mysql中不使用子查询就找到一些特定的记录

gblwokeq  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(244)

我的数据库中有两个表。两者都有大约100万条记录。我的第一个表uph包含订单的详细信息,另一个表urs包含客户的详细信息。它们的结构是:

mysql> desc uph;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| uid        | int(11)      | NO   |     | NULL    |                |
| order_from | varchar(255) | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

mysql> desc usr;
+---------+----------+------+-----+---------+----------------+
| Field   | Type     | Null | Key | Default | Extra          |
+---------+----------+------+-----+---------+----------------+
| uid     | int(11)  | NO   | PRI | NULL    | auto_increment |
| profile | char(10) | NO   |     | NULL    |                |
+---------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

两个表都有如下数据:

mysql> select * from usr;
+-----+----------+
| uid | profile  |
+-----+----------+
|   1 | in-store |
|   2 | ecom     |
|   3 | ecom     |
|   4 | in-store |
|   5 | ecom     |
+-----+----------+
4 rows in set (0.00 sec)

mysql> select * from uph;
+----+-----+------------+
| id | uid | order_from |
+----+-----+------------+
|  1 |   1 | in-store   |
|  2 |   2 | ecom       |
|  3 |   1 | ecom       |
|  4 |   4 | in-store   |
+----+-----+------------+
4 rows in set (0.00 sec)

现在,我想找到那些用户有配置文件“ecom”,如果他们做了任何购买然后订单从应该只有“ecom”。如果没有购买任何只有个人资料,仍将被视为“ecom”用户。
如果任何用户从ecom和店内购买了这两种产品,这些产品将从结果中删除。这意味着用户不应该与商店有任何关系。
因此,在查询的输出中,我们将得到如下结果:

+----+
| uid |
+-----+
|  2  |
|  3  |
|  5  |
+-----+

因为两个表都包含大量数据,所以我只限于用户子查询。请建议如何不使用子查询。

ovfsdjhp

ovfsdjhp1#

您可以执行一个join并根据您的条件检查聚合结果

select u.uid, u.profile
from usr u
left join uph p on u.uid = p.uid
where u.profile = 'ecom'
group by u.uid, u.profile
having sum(case when p.order_from = 'in-store' then 1 else 0 end) = 0

相关问题