我有一个非常复杂的查询,显示所有事件,除了那些它或它的类别/类型/子类型包含在一个名为'blocked'的表中。此外,它只显示活动的事件(active=1),并且结束时间介于当前时间和一天的结束时间之间。
SELECT e.* FROM `events` e WHERE NOT EXISTS (
SELECT 1 FROM `blocked` b
WHERE b.uid = '$uid'
AND (e.bid = b.bid OR e.category = b.category
OR e.type = b.type OR e.subtype = b.subtype))
AND active = '1'
AND end >= '$timeinfo[0]'
AND end <= '$timeinfo[2]'
现在,我还得到了另一个查询,它只显示给定距离内的所有事件。这些是按距离排序的。
SELECT *, ( 3959 * acos( cos( radians($items[3]) ) *
cos( radians( latitude ) ) * cos( radians( longitude )
- radians($items[4]) ) + sin( radians($items[3]) ) *
sin( radians( latitude ) ) ) )
AS distance FROM events HAVING distance < $distance
ORDER BY distance LIMIT 0 , $numberofhits;
但是,现在我需要把这两个组合起来。我对它们进行了一些尝试,但还没有得到任何接近工作的东西。从头开始会不会更好?
下面是这两个表的相关部分:
EVENTS:
eid | bid | category | type | subtype | latitude | longitude | start | end
001 | 00a | Nightlife | Bar | Karaoke | 33.457573 | -122.243475 | 1398686400 | 1398786400
BLOCKED:
uid | bid | category | type | subtype
001 | null | null | null | Karaoke
001 | 00a | null | null | null
001 | 00h | null | null | null
002 | null | null | Bar | null
在被阻塞的表中,用户001不希望看到任何来自BIDs 00a和00h的内容,也不希望看到任何与子类型"卡拉ok"(糟糕的歌声)相关的内容。然后,还有第二个用户002,他只是不想看到任何类型为"Bar"的东西。
最后我要显示的是$ myords [0], $ myords [1] (lat/long)的$distance miles内的所有事件,除了BID/category/type/subtype在BLOCKED中为$uid,按距离排序。我很感激你们给我的任何帮助
您应该能够简单地将您的距离计算添加到您的'阻塞'检查查询,以及相关条件。
我试图在sqlfiddle http://sqlfiddle.com/#上复制您的示例数据!2/90bab/8组合起来。您可以将用户id修改为001或002,以查看不同的结果。
作为参考,结果查询为SELECT e.*,
( 3959 * acos( cos( radians(-122.243475) ) *
cos( radians( latitude ) ) * cos( radians( longitude )
- radians(33.457573) ) + sin(-122.243475) ) *
sin( radians( latitude ) ) )
AS distance
FROM `events` e
WHERE
NOT EXISTS (
SELECT 1 FROM `blocked` b
WHERE b.uid = '001'
AND (e.bid = b.bid OR e.category = b.category
OR e.type = b.type OR e.subtype = b.subtype)
)
AND active = '1'
AND end >= 1398786400
AND end <= 1398786400
HAVING distance < 10000000000000;
请注意为了方便示例,我不得不删除php变量并执行以下操作
- 为 添加了一些例子坐标
- 增加了一个距离示例
- 删除限制
- 增加了一些例子时间
- 新增用户id示例。