ВЫБЕРИТЕ самую новую запись с ненулевым значением в одном столбце - PullRequest
0 голосов
/ 16 ноября 2009

У меня есть данные таблицы, которые выглядят так:

id | keyword | count | date
1 | ipod | 200 | 2009-08-02
2 | ipod | 250 | 2009-09-01
3 | ipod | 150 | 2009-09-04
4 | ipod | NULL | 2009-09-07

Теперь я получаю счетчик строки, которая имеет самую новую дату, но имеет ненулевое значение. В этом случае строка 3 со счетом 150.)

например

SELECT `keyword`, `count` , max( `date` ) 
FROM `keywords` 
WHERE keyword = "ipod"
AND `count` IS NOT NULL 
GROUP BY keyword

Это вернуло правильную дату, но не верный счет (вернул 200). Я также попытался сделать левое соединение с самим собой.

SELECT `t1`.`keyword` , `t2`.`count` , max( `t1`.`id` )
FROM `keywords` `t1`
LEFT JOIN `keywords` `t2` ON `t1`.`id` = `t2`.`id`
WHERE `t1`.`keyword` = 'ipod'
AND `t1`.`count` IS NOT NULL
GROUP BY `t1`.`keyword`

И это действительно получило максимальный идентификатор, но это не сработало, как я надеялся, и вернуло только 200.

Помощь

Ответы [ 3 ]

1 голос
/ 16 ноября 2009

Я уверен есть лучший способ, но в то же время:

SELECT `count`
FROM `keywords` 
WHERE keyword = "ipod"
AND `count` IS NOT NULL 
ORDER BY `date` DESC
LIMIT 1

Должно соответствовать вашим требованиям. Обратите внимание, что LIMIT не является переносимым SQL, поэтому он будет работать только для MySQL. Предложение ORDER BY необходимо для принудительной сортировки базы данных по дате.

Когда я упомянул, что должен быть лучший способ, это просто из-за того, как работает предложение LIMIT, а именно: База данных должна выбрать ВСЕ строки, которые соответствуют критериям запроса, а затем просто обрезает набор результатов до желаемое количество указано LIMIT.

1 голос
/ 16 ноября 2009
SELECT `keyword`, `count` , `date`
FROM `keywords` 
WHERE keyword = "ipod"
AND `count` IS NOT NULL 
order by date desc 
limit 1
0 голосов
/ 16 ноября 2009

Работает ли это для вас:

SELECT `keyword`, `count`, `date` 
FROM `keywords` 
WHERE keyword = "ipod"
AND `count` IS NOT NULL 
ORDER BY DATE DESC
LIMIT 1
...