仅选择必须满足两个条件的记录
Posted
技术标签:
【中文标题】仅选择必须满足两个条件的记录【英文标题】:SELECT only records which must fill two conditions 【发布时间】:2011-06-30 21:55:28 【问题描述】:我有这张桌子:
id type otherid
1 4 1234
2 5 1234
3 4 4321
如您所见,有3条记录,其中2条属于“1234”,类型为4和5。
最后一条记录属于“4321”的otherid,类型只有4。
我需要选择所有只有类型 4 而不是类型 5 的otherid。
示例:在该表上进行此选择后,查询应该只返回记录 3
谢谢
添加1:
请考虑 TYPE 可以是 1 到 20 之间的任意数字。 我只需要得到类型 4 但不是类型 5 的 otherid(除了它们可以有任何其他类型)
添加2:
使用 mysql 5.1
【问题讨论】:
你的描述对我来说有点慌张。您究竟希望查询返回什么?您使用的是什么数据库?根据您的描述,查询将是:SELECT * FROM table WHERE type = 4,但这与您的示例冲突 你是说你想要所有的otherid值,其中具有相同otherid的所有记录的类型都只有4? 我是说我想要得到 4 而不是 5 的 otherid(+ 可以找到的任何其他类型) 【参考方案1】:这是一种解决方法
SELECT * FROM (
SELECT GROUP_CONCAT('|',type,'|') type,other_id FROM table GROUP BY otherid
) t WHERE type LIKE '%|4|%' AND type NOT LIKE '%|5|%'
【讨论】:
+1 因为它工作正常!但是不能接受,因为太贵了~ 我知道你的意思.. 谢谢你的 + :)【参考方案2】:您可以使用not exists
子查询:
select distinct otherid
from YourTable as yt1
where yt1.type = 4
and not exists
(
select *
from YourTable as yt2
where yt1.otherid = yt2.otherid
and yt1.type <> yt2.type -- use this line for any difference
and yt2.type = 5 -- or this line to just exclude 5
)
【讨论】:
子句 不起作用,因为除了 4 和 5 之外还有许多其他类型,但我只需要获得 4 而不是 5 的记录(+任何其他可用类型) @yes123:答案已编辑...不确定您的意思是仅排除 5 或基本上任何不是 4 的内容,所以我将这两行都留在了【参考方案3】:另一种方法是使用左连接,从中排除同时具有类型 4 和 5 的行:
select a.*
from table1 a
left join table1 b on b.otherid = a.otherid and b.type = 5
where a.type = 4 and b.id is null
【讨论】:
如果您从 where 子句中删除“and b.id is null”并将选择更改为“select *”而不是“select a.*”,您可以看到这是如何工作的。你会看到类型 4 的行分为两类:otherid 的行显示在其他类型的其他行中(因此 b.id 不为空),otherid 的行不显示其他类型(并且有b.id null)。 等一下...我在我需要的子查询中尝试了这个查询,但总查询时间超过 50 秒 :( 此时我在这里询问了完整查询:***.com/questions/5060423/2-left-join-for-2-tables 如果你想帮忙以上是关于仅选择必须满足两个条件的记录的主要内容,如果未能解决你的问题,请参考以下文章