LINUX.ORG.RU

запрос к базе c использованием MAX

 


0

1

Здравствуйте. есть две таблицы:

temp
--id
--dev_id
--temp
--date

dev
--dev_id
--dev_name
--dev_type
--dev_desc

нужно для определенного dev_name (к примеру пусть будет dev_name='lol') вывести из таблицы temp значения temp.temp с максимальным id, а из таблицы dev вывести dev.desc.

Максимум, что я, со знанием, примерно равными нулю, смог вывести это:

				SELECT
				temp.temp,
				dev.desc
				FROM (
						SELECT 
						temp.id,
						temp.temp, 
						dev.desc 
						FROM  
						dev INNER JOIN temp ON dev.dev_id=temp.dev_id
						WHERE				
						dev.dev_id= 'lol'
						)
				WHERE
				temp.id=(SELECT MAX(temp.id) FROM temp)

помогите, пожалуйста, написать запрос правильно

★★★

вывести из таблицы temp значения temp.temp с максимальным id

С максимальным для данного дева или вообще с максимальным? Если второе, то задача существенно упрощается :)

Apple-ch ★★
()
SELECT temp.temp, dev.desc FROM (
  SELECT temp.id, temp.temp, dev.desc
    FROM dev INNER JOIN temp ON dev.dev_id=temp.dev_id
    WHERE dev.dev_id= 'lol'
) WHERE temp.id=(SELECT MAX(temp.id) FROM temp)

хотя бы так, что-ли (это не по теме, это к оформлению).

ABW ★★★★★
()
SELECT
    t.temp,
    d.dev_desc
FROM
    temp AS t,
    dev AS d
WHERE
    d.id = t.dev_id
    AND
    d.name = ?
    AND
    t.id = (
        SELECT max(temp.id)
        FROM temp
        WHERE temp.dev_id = t.dev_id
    )

кажется, как-то так.

GateKeeper ★★
()
Ответ на: комментарий от Kalashnikov

Да, так значительно лучше :)
Более реляционно, можно сказать.

dmitryalexeeff
()
Ответ на: комментарий от GateKeeper

Даже не так: условие про уникальность id по всей таблице отсутствует.

GateKeeper ★★
()

Ну чо, хоть один из запросов тут писанных не матерится?

p.s. MAX разве не только с GROUP BY работает? )))

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

Если извлекаем только и исключительно агрегат, то группировка не обязательна.

GateKeeper ★★
()
Ответ на: комментарий от Kalashnikov

SELECT dev.desc, temp.temp FROM dev INNER JOIN temp ON dev.dev_id = temp.dev_id
WHERE dev_name LIKE %lol% ORDER BY temp.id DESC LIMIT 1;

спасибо. Данный вариант отлично работает

disee ★★★
() автор топика
Ответ на: комментарий от vahtu

А давно WHERE перестал принципиально перестал использовать ключи (читай, индексы), если таковые имеются?

GateKeeper ★★
()
Ответ на: комментарий от vahtu

Опять чуть не забыл: LIMIT 1 вернет 1 и только 1 строку. В условиях задачи этого озвучено не было, так что ты потенциально накосорезил с LIMIT 1. Преждевременная оптимизация - бла-бла-бла...

GateKeeper ★★
()
Ответ на: комментарий от Kalashnikov

Только на первый взгляд. А потом приходит факап от DB Architect, который решил немного иначе.

GateKeeper ★★
()
Ответ на: комментарий от vahtu

1. Не документация, а best practices.

2. Процитирую ТС:

Максимум, что я, со знанием, примерно равными нулю

GateKeeper ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.