我已经到了需要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
依此类推......
最初我以为我可能会使用联接来获取信息,但由于有多个类别,这是行不通的。我想我可以创建每种类型的块的数组,并在每次迭代时针对此测试查询,但似乎应该有一种方法将其用于查询本身。有任何想法吗?谢谢你的帮助。
**注意:如果需要,我可以更改表的布局。
答案 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
)
)
)