mysql - 当每个 id 有多行时应用 where 条件(单个表或连接多个表)

标签 mysql sql tsql

我在 mysql/SQL Server 中有以下要求

Table Name: basic(pid int,av int,sid int,st int,wid int,wt int)

对于每个 pid,将有 10 行(包含每个 pid 的 sid,st 值和 wid,wt 值)。这些集合可以是 1 到 10。

因此,对于 pid 值(例如:3213 和 3214),将有 10 行,如下所示

enter image description here

像上面一样,可能有数百万条记录

我想要实现的是,我想要获取其(sid=2和相应的st>=7)以及其(wid=9和相应的wt>=6)的pid

如果我应用这个条件,我应该得到 pid 列表,其中必须有两个 pid 3213 和 3214。

如何使用简单的 SQL 查询来实现此目的,或者我可以将表分为三个,如 basic1(pid,av)、basic_sk(pid,sid,st) 和 basic_wc(pid,wid,wt)

因为我可以使用pid作为引用,所以我可以加入..即使我尝试使用加入,也无法达到所需的结果。

我使用了下面的连接 -

select t1.pid from basic1 t2
inner join basic_sk t2 on t1.pid=t2.pid
inner join basic_wc t3 on t3.pid=t2.pid
where (((t2.sid=2) and (t2.st>=7)) and ((t3.wid=9) and (t3.wt>=6)))

但没有运气。 如果我在 where 条件下有多个 sid 和 st 值以及 wid 和 wt 值怎么样? 就像集合 {sid=2,st>=7} 和 {sid=4,st>=9} 和 {wid=9,wt>=6} 和 {wid=5,wt>=5}

如何使用简单的sql查询来实现我的要求?

任何可能性对我来说都可以,一张表或多张表(使用连接)

最佳答案

一种方法是使用聚合和having子句;

select b.pid
from basic b
group by p.pid
having sum(case when (b.sid = 2) and (b.st >= 7) then 1 else 0 end) > 0 and
       sum(case when (b.wid = 9) and (b.wt >= 6) then 1 else 0 end) > 0;

having 子句中的每个条件都会对与每个条件匹配的行进行计数。 > 0 确保每一行至少有一行。

关于mysql - 当每个 id 有多行时应用 where 条件(单个表或连接多个表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33963186/

相关文章:

mysql - 在没有日期条件的mysql中查找最后10条记录

php - 删除级联中的实体在多对多关系中不起作用

sql - 细数一对一的关系

SQL Server 更新查询不起作用,但是,SQL 表示行受到影响

mysql - 创建一个计算 SQL 列,用于维护每个客户的运行订单总数

mysql - SQL识别k天内下单次数超过m次的客户

mysql - 在不损害用户数据的情况下集中登录 Django、MediaWiki 和 Roundup?

sql - 如果值与之前的行匹配,PostgreSQL 会减少行

sql - 在SQL中删除保留旧条目的重复数据

xml - 在 SQL Server 2008 及更高版本的同一查询中查询表和 XML 列的正确方法是什么?