仅选择必须满足两个条件的记录

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 如果你想帮忙

以上是关于仅选择必须满足两个条件的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何仅选择满足条件的第一行?

jQuery选择器删除满足两个条件的表行

用 SQLite 选择满足多个条件(但不是一起)的孩子的父记录

满足特定条件的列表的所有组合

流程控制语句使用总结

MYSQL从同一张表中选择不同的记录