|
|
|
| Есть таблица
CREATE TABLE `campaigns_keywords` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`cid` int(11) DEFAULT '0',
`keyword` varchar(255) DEFAULT NULL,
`cost` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `cost` (`cost`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
|
Примерные данные:
id cid keyword cost
9 10 рыбки 2
13 10 аквариум 2
18 14 ремонт 1
19 14 квартир 1
32 18 каталог 1
33 19 каталог 1
36 15 каталог 99
38 15 сайты 50
30 17 каталоги сайтов 1
35 19 каталог ссылок 3
37 18 каталог сайтов 2
|
Надо выбрать уникальные id кампании (cid) в которых встречаются заданные слова, отсортированные по стоимости слов. С этим проблем не возникло:
SELECT DISTINCT cid
FROM campaigns_keywords
WHERE keyword LIKE ('%каталог%')
OR keyword LIKE ('%сайт%')
ORDER BY cost DESC
|
Теперь же надо выбирать еще и id слов, а также их стоимость (cost) для статистики. DISTINCT, естественно, в пролете. Попробовал заменить на GROUP BY:
SELECT id, cid, cost
FROM campaigns_keywords
WHERE keyword LIKE ('%каталог%')
OR keyword LIKE ('%сайт%')
GROUP BY cid
ORDER BY cost
|
но результат не впечатлил... Насколько я понял, запрос сначала выбирает подходящие слова, потом группирует по cid, и только потом уже сортирует по цене. Но если походящее слово с большей ценой в одной кампании находиться ниже - то оно в результат уже не попадет.
Вопрос: можна все-таки одним запросом выбрать уникальный cid с id походящего слова максимального по цене? | |
|
|
|
|
|
|
|
для: JooZ
(12.05.2009 в 12:45)
| |
MIN(expr) , MAX(expr)
Возвращает минимальную или максимальную величину аргумента expr.
Функции MIN() и MAX() могут принимать строковый аргумент;
в таких случаях они возвращают минимальную или максимальную строковую величину.
See Раздел 5.4.3, «Использование индексов в MySQL».
mysql> SELECT student_name, MIN(test_score), MAX(test_score)
FROM student
GROUP BY student_name;
В MIN(), MAX() и других групповых фунциях MySQL сейчас сравнивает ENUM и
SET-столбцы по ихнему строковому представлению а не по относительной позиции строки в множестве.
Это будет исправлено.
|
| |
|
|
|
|
|
|
|
для: а-я
(13.05.2009 в 12:48)
| | Да, MAX() это хорошо, но вместе с GROUP BY получается каша, когда к нужному id подставляется максимальная цена из всей группы.
Но выход все-таки есть.
Здесь http://jan.kneschke.de/projects/mysql/groupwise-max описаны возможные пути решения. | |
|
|
|