Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

MySQL запрос

346
16 июля 2005 года
Новая папка
256 / / 24.12.2004
Помогите, пожалуйста, а то уже голова не варит!!!
У меня есть 3 таблицы: люди (user), события(event), и таблица, которая их соединяет (history).

Так вот у события есть тип (например, лето,осень,зима и весна).

Мне нужно составить примерно такой запросик: выбрать людей, которые посетили события с типами
зима два раза,
осень 1 раз,
весна никогда не посещали,
лето 5 раз.

Когда посещения больше ноля, я запрос составил, а вот "не посещали никогда" не могу сделать!
338
16 июля 2005 года
chigevara
529 / / 29.09.2003
Цитата:
Originally posted by Новая папка

Когда посещения больше ноля, я запрос составил, а вот "не посещали никогда" не могу сделать!


Ну и че за дрянь мы курим? :D
посещения=0.

304
16 июля 2005 года
Fenyx
707 / / 26.01.2005
Цитата:
Originally posted by Новая папка
Помогите, пожалуйста, а то уже голова не варит!!!
У меня есть 3 таблицы: люди (user), события(event), и таблица, которая их соединяет (history).

Так вот у события есть тип (например, лето,осень,зима и весна).

Мне нужно составить примерно такой запросик: выбрать людей, которые посетили события с типами
зима два раза,
осень 1 раз,
весна никогда не посещали,
лето 5 раз.

Когда посещения больше ноля, я запрос составил, а вот "не посещали никогда" не могу сделать!


IFNULL поэксперементируй, но ты уже взрослый врядли кто за тебя SQL запросы писать будеть ...
Или будет?...

15
16 июля 2005 года
shaelf
2.7K / / 04.05.2005
Цитата:
Originally posted by Fenyx
IFNULL поэксперементируй, но ты уже взрослый врядли кто за тебя SQL запросы писать будеть ...
Или будет?...


Я такие вещи может и не правильно, но всегда в лоб делаю:). Что то типа

 
Код:
SELECT * FORM user, event, history WHERE (не знаю где у тебя чего, так что даю примерно) history.summer = '1' AND (и т.д.)
346
18 июля 2005 года
Новая папка
256 / / 24.12.2004
2 всем

На самом деле это всё не так просто, как вы пишите. Это вооще на границе реальности.


Я думал сделать так: вытащить людей, которые находились в событиях, которые подходят по критерию поиска. А потом считать количество посещений каждого. НО, если критерий будет такой, зима=0. Нифига не найдётся.

Потом я думал сделать так, вытащить всех людей, которые в базе, а потом искать посещения. НО, у меня в базе 40 000 людей + табица с событиями + таблица с хистори. Если сервак не накроется, то по крайней мере скрипт будет ОЧЕНЬ долго выполнятся.

КОроче вариантов было куча. Не один не подходит.
488
18 июля 2005 года
Mоngооsе
465 / / 01.04.2005
Не посещал вообще
 
Код:
SELECT user.userid, user.username
  FROM user
  LEFT JOIN history ON user.userid=history.userid
  WHERE history.userid IS NULL

Не посещал 'весна'. Нужен mySql выше 4й версии версии
 
Код:
[code]
SELECT * FROM user
  WHERE userid NOT IN(
    SELECT DISTINCT history.userid
      FROM history, event
      WHERE event.eventname='весна' AND
        event.eventid=history.eventid

'лето' 5 раз.
 
Код:
SELECT * FROM user
  WHERE userid IN
   (SELECT userid FROM history
      WHERE eventid IN (SELECT eventid FROM event                    WHERE eventname='лето')
      GROUP BY userid, eventid
      HAVING COUNT(*) = 5)
346
18 июля 2005 года
Новая папка
256 / / 24.12.2004
Цитата:
Originally posted by Mоngооsе
Не посещал 'весна'. Нужен mySql выше 4й версии версии
 
Код:
[code]
SELECT * FROM user
  WHERE userid NOT IN(
    SELECT DISTINCT history.userid
      FROM history, event
      WHERE event.eventname='весна' AND
        event.eventid=history.eventid


в том то и гониво, что всё надо сделать с помощью 4-го мускула.
И причем эти все условия должны выполнятся одновременно.

488
18 июля 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Новая папка
в том то и гониво, что всё надо сделать с помощью 4-го мускула.
И причем эти все условия должны выполнятся одновременно.

Тогда придется использовать временные таблицы, типа

CREATE TABLE tmp
SELECT DISTINCT userid FROM history
WHERE eventid=:springid;

И LEFT JOIN.

346
18 июля 2005 года
Новая папка
256 / / 24.12.2004
Уже приближаюсь к завершению. Но только, чёт я вообще затормозился. Мне нужно вытащить людей у которых нет такого типа. Как это сделать.
Просто чувак может посетить весну 1 раз и лето 1 раз. И если я буду вытаскивать WHERE type<>'весна', он все равно вытащит того чувака, потому что он посещал не весну а лето.
346
18 июля 2005 года
Новая папка
256 / / 24.12.2004
Цитата:
Originally posted by Mоngооsе
Попробуй
 
Код:
SELECT user.userid, user.username
  FROM user
  LEFT JOIN history ON user.userid=history.userid
  WHERE history.eventtype='весна' AND history.userid IS NULL



Не получится, потому что userid - НУЛЛ, тогда мы не сможем вытащить его имя.
И тип события хранится в таблице событий, а не в ивенте.

Блин, что же делать:(

346
18 июля 2005 года
Новая папка
256 / / 24.12.2004
Вроде такой правилный запрос:
 
Код:
SELECT u.name,COUNT(h.userid) as c
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
346
18 июля 2005 года
Новая папка
256 / / 24.12.2004
Цитата:
Originally posted by Новая папка
Вроде такой правилный запрос:
 
Код:
SELECT u.name,COUNT(h.userid) as c
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


Блин, это тоже неправильно(

488
18 июля 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Новая папка
Блин, это тоже неправильно(


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;

Если не можно использовать подзапросы, то иначе думаю никак.

346
18 июля 2005 года
Новая папка
256 / / 24.12.2004
Цитата:
Originally posted by Mоngооsе
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;

Если не можно использовать подзапросы, то иначе думаю никак.



У программистов мысли сходится)) Я только начал отрабатывать этот вариант.
Большое спасибо!!!!!!!
Надеюсь, тема закрыта:)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог