MySQL запрос
У меня есть 3 таблицы: люди (user), события(event), и таблица, которая их соединяет (history).
Так вот у события есть тип (например, лето,осень,зима и весна).
Мне нужно составить примерно такой запросик: выбрать людей, которые посетили события с типами
зима два раза,
осень 1 раз,
весна никогда не посещали,
лето 5 раз.
Когда посещения больше ноля, я запрос составил, а вот "не посещали никогда" не могу сделать!
Когда посещения больше ноля, я запрос составил, а вот "не посещали никогда" не могу сделать!
Ну и че за дрянь мы курим? :D
посещения=0.
Помогите, пожалуйста, а то уже голова не варит!!!
У меня есть 3 таблицы: люди (user), события(event), и таблица, которая их соединяет (history).
Так вот у события есть тип (например, лето,осень,зима и весна).
Мне нужно составить примерно такой запросик: выбрать людей, которые посетили события с типами
зима два раза,
осень 1 раз,
весна никогда не посещали,
лето 5 раз.
Когда посещения больше ноля, я запрос составил, а вот "не посещали никогда" не могу сделать!
IFNULL поэксперементируй, но ты уже взрослый врядли кто за тебя SQL запросы писать будеть ...
Или будет?...
IFNULL поэксперементируй, но ты уже взрослый врядли кто за тебя SQL запросы писать будеть ...
Или будет?...
Я такие вещи может и не правильно, но всегда в лоб делаю:). Что то типа
На самом деле это всё не так просто, как вы пишите. Это вооще на границе реальности.
Я думал сделать так: вытащить людей, которые находились в событиях, которые подходят по критерию поиска. А потом считать количество посещений каждого. НО, если критерий будет такой, зима=0. Нифига не найдётся.
Потом я думал сделать так, вытащить всех людей, которые в базе, а потом искать посещения. НО, у меня в базе 40 000 людей + табица с событиями + таблица с хистори. Если сервак не накроется, то по крайней мере скрипт будет ОЧЕНЬ долго выполнятся.
КОроче вариантов было куча. Не один не подходит.
FROM user
LEFT JOIN history ON user.userid=history.userid
WHERE history.userid IS NULL
Не посещал 'весна'. Нужен mySql выше 4й версии версии
SELECT * FROM user
WHERE userid NOT IN(
SELECT DISTINCT history.userid
FROM history, event
WHERE event.eventname='весна' AND
event.eventid=history.eventid
'лето' 5 раз.
WHERE userid IN
(SELECT userid FROM history
WHERE eventid IN (SELECT eventid FROM event WHERE eventname='лето')
GROUP BY userid, eventid
HAVING COUNT(*) = 5)
Не посещал 'весна'. Нужен mySql выше 4й версии версии
SELECT * FROM user
WHERE userid NOT IN(
SELECT DISTINCT history.userid
FROM history, event
WHERE event.eventname='весна' AND
event.eventid=history.eventid
в том то и гониво, что всё надо сделать с помощью 4-го мускула.
И причем эти все условия должны выполнятся одновременно.
в том то и гониво, что всё надо сделать с помощью 4-го мускула.
И причем эти все условия должны выполнятся одновременно.
Тогда придется использовать временные таблицы, типа
CREATE TABLE tmp
SELECT DISTINCT userid FROM history
WHERE eventid=:springid;
И LEFT JOIN.
Просто чувак может посетить весну 1 раз и лето 1 раз. И если я буду вытаскивать WHERE type<>'весна', он все равно вытащит того чувака, потому что он посещал не весну а лето.
Попробуй
FROM user
LEFT JOIN history ON user.userid=history.userid
WHERE history.eventtype='весна' AND history.userid IS NULL
Не получится, потому что userid - НУЛЛ, тогда мы не сможем вытащить его имя.
И тип события хранится в таблице событий, а не в ивенте.
Блин, что же делать:(
FROM
USERS as u, EVENT as e, HISTORY as h
WHERE
h.eventid = e.eventid
AND h.userid = u.userid
AND e.type<>'spring'
GROUP BY h.userid
HAVING c=1
Вроде такой правилный запрос:
FROM
USERS as u, EVENT as e, HISTORY as h
WHERE
h.eventid = e.eventid
AND h.userid = u.userid
AND e.type<>'spring'
GROUP BY h.userid
HAVING c=1
Блин, это тоже неправильно(
Блин, это тоже неправильно(
CREATE TABLE tmp SELECT DISTINCT userid AS userid
FROM history WHERE eventtype='весна';
SELECT user.userid, user.username FROM user
LEFT JOIN tmp ON user.userid=tmp.userid
WHERE tmp.userid is null;
Если не можно использовать подзапросы, то иначе думаю никак.
CREATE TABLE tmp SELECT DISTINCT userid AS userid
FROM history WHERE eventtype='весна';
SELECT user.userid, user.username FROM user
LEFT JOIN tmp ON user.userid=tmp.userid
WHERE tmp.userid is null;
Если не можно использовать подзапросы, то иначе думаю никак.
У программистов мысли сходится)) Я только начал отрабатывать этот вариант.
Большое спасибо!!!!!!!
Надеюсь, тема закрыта:)