Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: DISTINCT или GROUP BY
 
 автор: JooZ   (12.05.2009 в 12:45)   письмо автору
 
 

Есть таблица
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 походящего слова максимального по цене?

  Ответить  
 
 автор: а-я   (13.05.2009 в 12:48)   письмо автору
 
   для: 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-столбцы по ихнему строковому представлению а не по относительной позиции строки в множестве. 
Это будет исправлено. 

  Ответить  
 
 автор: JooZ   (13.05.2009 в 15:09)   письмо автору
 
   для: а-я   (13.05.2009 в 12:48)
 

Да, MAX() это хорошо, но вместе с GROUP BY получается каша, когда к нужному id подставляется максимальная цена из всей группы.

Но выход все-таки есть.
Здесь http://jan.kneschke.de/projects/mysql/groupwise-max описаны возможные пути решения.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования