2012-02-27 3 views
0

им с трудом, с большим сложным запросом я писал: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}

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

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

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

большое спасибо! very appriciated

+0

Woah, проблема не * просто * где область. Вам не нужно столько подзапросов, вы можете просто использовать таблицы во внешнем соединении ... – Konerak

+0

И, к сожалению, это НЕ сложный запрос. Сложный запрос по крайней мере в 5 раз длиннее. * * Очень сложный запрос - 10 КБ при сохранении в текстовом файле. :) –

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

То же самое для нескольких диапазонов, у вас будет таблица «диапазон», которая связывает идентификатор события с минимальным возрастом, максимальным возрастом, и вы присоединитесь к событию до своего возраста.

+0

спасибо, минимальный и максимальный возраст хорош для меня ... как насчет областей? скажем, у меня есть 30 областей (Города) ... как я могу это сделать? – Amir

+0

Добавьте дополнительную таблицу, которая связывает событие с областью. Традиционно необходимы три столбца: ID, EVENT_ID, AREA_ID. Присоединитесь к этой таблице и включите area_id в свое предложение where. ** Вы должны прочитать нормализацию **. – Konerak

Смежные вопросы