SQL - 非常复杂的查询

时间:2012-02-27 16:01:00

标签: mysql sql

我写了一篇很复杂的查询时遇到了困难:

SELECT e.id, e.name,e.age, e.area, e.date,e.private, e.place, p.*, COUNT(user) AS attending
 FROM events AS e
 LEFT OUTER JOIN
 (SELECT user, event
 FROM attendance
 ) AS a
 ON a.event = e.id
 LEFT OUTER JOIN
 (SELECT name AS place_name, id as idd, nz AS place_loc, coor
 FROM places
 ) AS p
 ON p.idd = e.place
 where (e.age LIKE "%{17-18}" OR e.age LIKE "%{18-19}" OR e.area LIKE "%{1}" OR e.area LIKE "%{2}" OR e.area LIKE "%{4}" OR e.area LIKE "%{6}" OR e.area LIKE "%{32}" OR e.area LIKE "%{37}" OR e.private LIKE '%id%' )
 GROUP BY e.id, e.name
 ORDER BY attending DESC

 limit 0,7

此查询为我提供了事件,它通过考勤表对它们进行排序,并且它还为我提供了有关该事件所在地的信息。

无论如何,问题出在WHERE区域......每个用户都有不同的年龄和区域。例: 年龄:{17-18},{20-22}区域:{0},{1},{2}

每个事件都有相同的东西 - 年龄和地区......我正在努力寻找一个匹配项目:

如果设置了事件:年龄 - {15-16},{17-18}且用户至少设置了其中一个,则会匹配。

我不介意改变我存储年龄和区域的方式..我确信通过使用{}我做得不好,我想要的是一种设置用户偏好的方法,他可以保存区号和年龄范围,然后我想从事件中选择与用户年龄和区域匹配的事件。

非常感谢你!非常苛刻的

1 个答案:

答案 0 :(得分:4)

首先,删除子查询。您可以单独使用连接编写查询:

SELECT 
  e.id, e.name,e.age, e.area, e.date,e.private, e.place, 
  p.name AS place_name, p.id as idd, p.nz AS place_loc, p.coor
  COUNT(user) AS attending
FROM 
  events AS e
LEFT OUTER JOIN
   attendance a
ON 
  a.event = e.id
LEFT OUTER JOIN
 places p
ON 
  p.idd = e.place
WHERE 
  e.age LIKE "%{17-18}" OR e.age LIKE "%{18-19}" OR e.area LIKE "%{1}" OR e.area LIKE "%{2}" OR e.area LIKE "%{4}" OR e.area LIKE "%{6}" OR e.area LIKE "%{32}" OR e.area LIKE "%{37}" OR e.private LIKE '%id%' )
 GROUP BY e.id, e.name
 ORDER BY attending DESC
 LIMIT 0,7

现在,开始逻辑。你为什么要存储这样的事件年龄?每个活动可以只有一个最小年龄和一个最大年龄,还是你需要一个范围?

对于一个最小和最大年龄,您的where子句将成为e.min和e.max之间的简单user.age。

对于多个范围,您将拥有一个表'范围',用于将事件ID与最小年龄,最大年龄相关联,您将把事件加入其年龄。