从MySQL获取未在另一个表中阻止的事件列表

时间:2014-04-28 03:06:08

标签: php mysql

我已经到了需要MySQL中看起来过于复杂的查询的地步。基本上,我有一个表是事件列表:

eventid | businessid | category | type | subtype | start | end

在指定时间内获取事件很容易。但是,用户还可以使用businessid,类别,类型或子类型字段阻止事件显示。这些列在“被阻止”表格中......

userid | businessid | category | type | subtype 

此表仅列出其用户ID以及项目已阻止

中的信息
00001 | b00001 | null | null | null
00001 | null | nightlife | null | null

依此类推......

最初我以为我可能会使用联接来获取信息,但由于有多个类别,这是行不通的。我想我可以创建每种类型的块的数组,并在每次迭代时针对此测试查询,但似乎应该有一种方法将其用于查询本身。有任何想法吗?谢谢你的帮助。

**注意:如果需要,我可以更改表的布局。

2 个答案:

答案 0 :(得分:3)

我只是使用NOT EXISTS任何匹配行的谓词创建blocked子句。

SELECT e.* FROM `events` e
WHERE NOT EXISTS (
    SELECT 1 FROM `blocked` b
    WHERE b.userid = :user_id -- this is a parameter for the user ID
    AND (
        e.businessid = b.businessid
        OR e.category = b.category
        OR e.type = b.type
        OR e.subtype = b.subtype
    )
)

答案 1 :(得分:0)

除了列为null之外,您需要完全匹配。所以我认为这应该有用。

select * from events e
where not exists (
    select * from blocked b 
    where b.user_id = ?
    and (
        (b.business_id = e.business_id OR b.business_id IS NULL)
        AND (b.category = e.category OR b.category IS NULL)
        AND (b.type = e.type OR b.type IS NULL)
        AND (b.subtype = e.subtype OR b.subtype IS NULL)
        AND (
            b.business_id IS NOT NULL 
            OR b.category IS NOT NULL 
            OR b.type IS NOT NULL 
            OR b.subtype IS NOT NULL
        )
    )
)