Помогите написать mysql запрос

E
На сайте с 05.05.2006
Offline
89
564

Здравствуйте!

Есть две таблицы а и b.

Структура а:

id - идентификатор, adv - текст объявления.

Содержание а:

1, продам слона;

2, продам ослика.

Структура b:

id - идентификатор, adv_id - id объявления, date_up - дата поднятия объявления.

Содержание b:

1, 1, 1.1.2010;

2, 1, 2.2.2010;

3, 1, 3.3.2010;

Т.е. объявление id=1 было поднятно 3 раза, и последний раз поднималось 3 марта.

Нужно выбрать все объявления с последней датой поднятия.

Результат нужно вывести примерно такой:

adv_id, adv, date_up

1, продам слона, 3.3.2010

2, продам ослика, 0

ps делая обычный join, связка происходит не по нужной строке в таблице b, и, следовательно, в поле date_up не обязательно будет последняя дата.

пансионат для пожилых людей (https://mirnika.ru)
J
На сайте с 02.02.2009
Offline
53
#1

SELECT a.id, a.adv, b.date_up FROM a LEFT JOIN b ON b.adv_id = a.id GROUP BY a.id ORDER BY b.date_up DESC выведет с теми, у кого нет даты поднятия

E
На сайте с 05.05.2006
Offline
89
#2

Я уже написал что нужно получить в итоге:

Нужно выбрать все объявления с последней датой поднятия.
Результат нужно вывести примерно такой:
adv_id, adv, date_up
1, продам слона, 3.3.2010
2, продам ослика, 0

Без даты вывести записи не проблема. Нужно вывести ВСЕ объявления, но чтобы в поле date_up выводилась последняя дата поднятия объявления (если даты поднятия нет, то выводить в поле date_up ноль).

J
На сайте с 02.02.2009
Offline
53
#3

SELECT a.id, a.adv, IF(b.date_up,b.date_up,0) as date_up FROM a LEFT JOIN b ON b.adv_id = a.id GROUP BY a.id ORDER BY b.date_up DESC

[Удален]
#4
jumash:
GROUP BY a.id

тут будет получаться "о боже, что это?" :)))

тс это и спрашивает как этого избежать

J
На сайте с 02.02.2009
Offline
53
#5

Почему о боже что это?

Не поленился и сделал тест - работает как надо, учитывая что a.id - это b.adv_id конечно



CREATE TABLE IF NOT EXISTS `a` (
`id` int(11) NOT NULL auto_increment,
`text` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;


INSERT INTO `a` (`id`, `text`) VALUES
(1, 'a'),
(2, 'b'),
(3, 'c'),
(4, 'd');

CREATE TABLE IF NOT EXISTS `b` (
`id` int(11) NOT NULL auto_increment,
`a_id` int(11) NOT NULL,
`date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;


INSERT INTO `b` (`id`, `a_id`, `date`) VALUES
(1, 1, '2010-03-09 11:24:32'),
(2, 1, '2010-03-08 13:24:36'),
(3, 1, '2010-03-01 13:25:45'),
(4, 1, '2010-03-05 13:25:48'),
(5, 3, '2010-03-09 11:26:12'),
(6, 3, '2010-03-04 13:26:20');

SELECT a.text, b.date

FROM a

LEFT JOIN b ON a.id = b.a_id

GROUP BY a.id

ORDER BY b.date DESC

LIMIT 0 , 30

text date

c 2010-03-09 11:26:12

a 2010-03-09 11:24:32

b NULL

d NULL

[Удален]
#6
jumash:
Почему о боже что это?

потому что сначала делается группировка, а потом сортировка :)

поэтому даты будут в разброс а не как хочется :)

но в данной ситуации лечится просто

SELECT a.id, a.adv, max(b.date_up) as date_up FROM a LEFT JOIN b ON b.adv_id = a.id GROUP BY a.id ORDER BY max(b.date_up) DESC
skAmZ
На сайте с 04.09.2009
Offline
122
#7
bearman:
ORDER BY max(b.date_up)

order by 3 ;)

frantic
На сайте с 09.02.2009
Offline
27
#8
skAmZ:
order by 3

уверен что сработает?

skAmZ
На сайте с 04.09.2009
Offline
122
#9

frantic, абсолютно)

[Удален]
#10
skAmZ:
order by 3

можно и так :)

просто я торопился

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий