MYSQL查询 - 列出在给定距离内未被阻止的事件

时间:2014-05-04 23:45:50

标签: php mysql

我有一个相当复杂的查询,它显示所有事件,除了它或它的类别/类型/子类型包含在名为“阻止”的表格中。此外,它仅显示活动的事件(活动= 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不希望看到来自BID 00a和00h的任何内容,也没有任何关于子类型&#34;卡拉OK&#34; (糟糕的歌声)然后,有第二个用户002,他们不想看到任何类型&#34; Bar&#34;。

最终之后的显示将是$ mycoords [0],$ mycoords [1](纬度/经度)的$ distance里程内的所有事件除了BID / category / type / subtype之外以$ uid为单位,按距离排序。我很感激你们给我的任何帮助。

1 个答案:

答案 0 :(得分:1)

您应该只需将距离计算添加到“阻止”检查查询以及相关条件。

我试图在sql fiddle 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变量并执行以下操作

  • 为lat / long
  • 添加了一些示例坐标
  • 添加了示例距离
  • 删除了LIMIT
  • 添加了一些示例时间
  • 添加了一个示例用户ID。