SQL - очень сложный запрос - PullRequest
       2

SQL - очень сложный запрос

0 голосов
/ 27 февраля 2012

у меня трудные времена с большим сложным запросом, я написал:

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

Этот запрос дает мне события, сортирует их по таблице посещаемости, а также дает мне информацию о месте, где проходит событие.

В любом случае, проблема в области ГДЕ ... у каждого пользователя разные возрасты и области. пример: возраст: {17-18}, {20-22} областей: {0}, {1}, {2}

каждое событие имеет одно и то же - возраст и область ... я пытаюсь найти соответствие:

если установлено событие: ages- {15-16}, {17-18} и для пользователя задано хотя бы одно из них, оно будет соответствовать.

Я не против изменить способ хранения возрастов и областей ... я уверен, что я не справляюсь с этим с помощью {}, все, что я хочу, - это способ установить предпочтения пользователя, где он может сохранять коды городов и диапазон возрастов, а затем я хочу выбрать из событий только событие, которое совпадает с возрастом и областями пользователя.

Большое спасибо! очень ценный

1 Ответ

4 голосов
/ 27 февраля 2012

Прежде всего удалите подзапросы. Вы можете написать запрос, используя только объединения:

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 становится простым user.age между e.min и e.max.

То же самое для нескольких диапазонов, у вас будет таблица 'range', которая связывает идентификатор события с min-age, max-age, и вы присоединяете событие к его возрастам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...