1

嗨,我想知道是否有人可以帮助我进行查询。我正在尝试从值不是多个值的 EAV 类型表中进行选择。

使用下面的示例,我正在尝试检索 tag_id != 1 和 tag_id != 2 的行。因此,根据数据,我只想返回包含 contact_id 3 的行

Tags Table:

contact_id     tag_id 
  1             1
  1             2
  2             1
  2             4
  3             4

期望的结果是返回单行:

contact_id -> 3

我尝试了以下查询,这些查询不返回我正在寻找的内容,因此显然不正确:

select `contact_id` from `contact_tags` where tag_id !=1 and tag_id != 2

select `contact_id` from `contact_tags` where tag_id NOT IN(1,2)

对此有任何帮助。或者只是一个指向正确方向的指针会很棒。

4

3 回答 3

2

您可以使用which 里面的语句选择它具有orNOT EXISTS()标记的所有记录。12

SELECT  contact_id
FROM    contact_tags a
WHERE   NOT EXISTS
        (
            SELECT  1
            FROM    contact_tags b
            WHERE   tag_id IN (1, 2) AND
                    a.contact_id = b.contact_id
        )
GROUP   BY contact_id

另一种选择是使用LEFT JOIN

SELECT  a.contact_id
FROM    contact_tags a
        LEFT JOIN contact_tags b
          ON a.contact_id = b.contact_id AND
              b.tag_id IN (1, 2)
WHERE   b.contact_id IS NULL
于 2013-09-26T17:36:21.893 回答
1

可能这就是你想要的

select contact_id 
from contact_tags 
where contact_id not in (
    select contact_id from contact_tags where tag_id in (1,2)
) tmp
于 2013-09-26T17:39:50.770 回答
0

这里从@491243 fiddle 窃取是一个修改,它返回缺少两个 tags_id 的 contacts_id

http://sqlfiddle.com/#!2/b2b11/19

于 2013-09-26T17:38:47.060 回答