SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 27.06.2010 13:04:35

RusAlex
Участник
Зарегистрирован: 27.06.2010
Сообщений: 8

нужна помощь с подзапросом

Есть 3 таблицы
1:  logins (id,name)
2:  ads (id)
3: ads_history(adid,loginid,timestamp)

Хочу получить такой результат:
login.name | ads_history max(timestamp) for this adid | ads_history min(timestamp) for this adid


Для выборки logins.name получается подзапрос
SELECT adid,(SELECT login from logins WHERE id=ads_history.loginid) as login FROM `ads_history` GROUP by adid

а вот как максимальные значения timestamp выбрать для соответствующих ads.id из ads_history - НЕ ПОЛУЧАЕТСЯ;

пол дня уже убил на это, помогите если можете

Отредактированно RusAlex (27.06.2010 13:05:21)

Неактивен

 

#2 27.06.2010 13:09:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: нужна помощь с подзапросом

SELECT adid, max(timestamp), min(timestamp), (SELECT login from logins WHERE id=ads_history.loginid) as login FROM `ads_history` GROUP by adid;

Неактивен

 

#3 27.06.2010 13:18:40

RusAlex
Участник
Зарегистрирован: 27.06.2010
Сообщений: 8

Re: нужна помощь с подзапросом

smile) а ведь сам пробовал

Неактивен

 

#4 27.06.2010 13:18:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: нужна помощь с подзапросом

Но лучше переписать без использования подзапроса, так как в данном случае он выполняется избыточное количество раз (часть результатов потом удалиться за счет использования group by). Правильно ли я понимаю, что у вас для фиксированого значения adid loginid одно и тоже?

SELECT l.name, t1.adid, t1.max(timestamp), t1.min(timestamp) FROM
(SELECT adid,loginid, max(timestamp), min(timestamp) FROM `ads_history` GROUP by adid) t1
JOIN logins l ON t1.loginid=l.id;

Неактивен

 

#5 27.06.2010 13:23:30

RusAlex
Участник
Зарегистрирован: 27.06.2010
Сообщений: 8

Re: нужна помощь с подзапросом

vasya написал:

Правильно ли я понимаю, что у вас для фиксированого значения adid loginid одно и тоже?

нет. adid i loginid в ads_history могут быть различны
adid loginid
1      1
1      2
1      3
2      1
2      2
2      3

Неактивен

 

#6 27.06.2010 13:24:33

RusAlex
Участник
Зарегистрирован: 27.06.2010
Сообщений: 8

Re: нужна помощь с подзапросом

и потом еще надо будет оставить возможность сортировки по всем этим полям

Неактивен

 

#7 27.06.2010 13:29:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: нужна помощь с подзапросом

А как же вы в таком случае группируете по adid, не используя группирующую функцию для loginid?
Какое значение loginid вы при этом ожидаете получить? Оно может быть произвольным.

Неактивен

 

#8 27.06.2010 13:36:53

RusAlex
Участник
Зарегистрирован: 27.06.2010
Сообщений: 8

Re: нужна помощь с подзапросом

да надо группировать по loginid тоже. спасибо что заметили

Неактивен

 

#9 27.06.2010 14:10:35

RusAlex
Участник
Зарегистрирован: 27.06.2010
Сообщений: 8

Re: нужна помощь с подзапросом

Vasya получилось так:

SELECT adid, max(timestamp) as max_timestamp, min(timestamp) as min_timestamp,count(id) as total, (SELECT  login from logins WHERE  id=ads_history.loginid) as  login, (SELECT title FROM ads WHERE id=ads_history.adid) as title , (SELECT description FROM ads WHERE id=ads_history.adid) as description, (SELECT redirects FROM ads WHERE id=ads_history.adid) as redirects   FROM `ads_history` GROUP  by adid,loginid
 


сейчас надо добавить выборку по таблице login, в ней есть несколько текстовых полей (varchar) и надо добавить по некоторым поиск. чтобы выводились только те ads_history у которых loginid соответствует заданному поиску из таблицы login

Неактивен

 

#10 27.06.2010 14:30:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: нужна помощь с подзапросом

Теперь добавляете в конец запроса HAVING и пишите нужные условия.

Но лучше сначала выбрать необходимые строки из logins, а затем объединять с `ads_history` и ads.

Неактивен

 

#11 27.06.2010 14:37:45

RusAlex
Участник
Зарегистрирован: 27.06.2010
Сообщений: 8

Re: нужна помощь с подзапросом

vasya написал:

Но лучше сначала выбрать необходимые строки из logins, а затем объединять с `ads_history` и ads.

как это сделать ?

как я понимаю надо создать временную объединенную таблицу для моей выборки и уже работать с ней. Но не хватает у меня знаний в mysql очень.

Отредактированно RusAlex (27.06.2010 14:39:26)

Неактивен

 

#12 27.06.2010 14:49:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: нужна помощь с подзапросом

Нет, временная объединенная таблица не нужна. Просто подзапрос используется в части FROM.
В приведенном ниже примере выборка из таблицы `ads_history` обозначается как t1, а из logins как t2. И далее запрос работает с таблицами t1,t2.

SELECT * FROM
(SELECT adid,loginid, max(timestamp) as max_timestamp, min(timestamp) as min_timestamp FROM `ads_history` GROUP by adid,loginid) t1
JOIN (SELECT * FROM logins WHERE условия выборки)t2 ON t1.loginid=t2.id ......

Подробнее синтаксис join см http://dev.mysql.com/doc/refman/5.1/en/join.html

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson