SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.12.2010 11:07:54

tazododu
Завсегдатай
Зарегистрирован: 24.09.2010
Сообщений: 51

Выборка кол-ва уникальных строк при использовании GROUP BY

Всем привет!

Не могу сам найти решение так вот задачи
Имеется таблица
id   type   value
1     a      val2
2     a      val2
3     b      val
4     c      val2
5     c      val
6     d      val2

Делаю выборку


SELECT SQL_CALC_FOUND_ROWS COUNT(`id`) FROM `tbl` GROUP BY(`type`) WHERE `value` = 'val2' LIMIT 2
SELECT FOUND_ROWS()
 

Первым запросом получаю кол-во по каждому типу(type a(2 шт), с(1 шт)), вторым общее кол-во уникальных типов(a,c,d - 3 шт).
Что хочу получить, но не получается - Получить кол-во всех уникальных строк(a[2шт]+с[1шт]+d[1шт]) удовлетворяющих условию из первого запроса.

Отредактированно tazododu (03.12.2010 11:09:09)

Неактивен

 

#2 03.12.2010 11:45:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

А чем Вас не устраивает убрать LIMIT 2 из первого запроса?

Неактивен

 

#3 03.12.2010 12:47:46

tazododu
Завсегдатай
Зарегистрирован: 24.09.2010
Сообщений: 51

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

У меня постраничная навигация и сложный запрос, просто я тут привел упрощенный пример того, что у меня не получается сделать.
На самом деле запрос у меня вот такой

Неактивен

 

#4 03.12.2010 15:30:46

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

Хм... Противоречите сами себе.
"Получить кол-во всех уникальных строк(a[2шт]+с[1шт]+d[1шт]) удовлетворяющих условию из первого запроса."
и
"постраничная навигация" (т.е. получит' тол'ко N записей)

Если вариант первый - долой LIMIT
Если второй - да здравствует LIMIT

А то и рыбку с'ест' и ...(забыл) sad

Неактивен

 

#5 03.12.2010 15:34:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

Знаете, упрощенный вариант мне нравится больше wink

Я правильно понимаю, что в результате Вы хотите получить одно число
2 + 1 + 1 = 4? В этом случае оно (в упрощенном варианте) будет просто
SELECT COUNT(*) FROM tbl WHERE value = 'val2'.

Если нужны количества по типам, то таки просто убрать LIMIT.

Неактивен

 

#6 04.12.2010 12:55:06

tazododu
Завсегдатай
Зарегистрирован: 24.09.2010
Сообщений: 51

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

Задача такая - есть поиск, выбирает товары поставщиков, группирую по поставщикам и ведя подсчет сгруппированных товаров.
Например ищем кирпич
1. Фирма Такаята товаров удовлетворяющих условиям столько-то
2. Фирма Такаята товаров удовлетворяющих условиям столько-то
Т.к. была группировка по фирмам следовательно SELECT FOUND_ROWS() отдаст мне кол-во фирм(и кол-во товаров для каждой фирмы). Конечно, если бы не было лимита можно было бы просто сложить все кол-ва товаров для всех фирм.

Нужно сделать такой же поиск как тут http://prom.ua/search?search_scope=prod … 1%82%D0%B8

Prom.ua›Товары и услуги› Результаты по запросу «Кирпич» (8374 наименований от 1214 поставщиков)

неужели это нельзя сделать одним запросом? как же они сделали так? ночами не сплю голову ломаю))

Неактивен

 

#7 04.12.2010 14:30:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

А почему Вы считаете, что они это сделали одним запросом? wink

Хотя, конечно, они читеры, и сделали одним:
SELECT COUNT(*) AS items, COUNT(DISTINCT `supplier`) AS suppliers FROM items WHERE MATCH(name) AGAINST ('кирпич');

Неактивен

 

#8 09.12.2010 11:36:05

tazododu
Завсегдатай
Зарегистрирован: 24.09.2010
Сообщений: 51

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

Так пока и не нашел решения этой задачи, применительно к своему запросу, и решил пока не выводит на сайте общее число найденных товаров, мож ближе к новому году придет озарение smile

Но столкнулся с другой подлой особенностью GROUP BY ...
Необходимо выбрать товары сгруппировав по производителю с условием, что при группировке  должен показываться последний отредактированный товар и все отсортировано по дате редактирования.
Написал вот такую вот кверюху

SELECT SQL_CALC_FOUND_ROWS (COUNT(`goods`.`id`)-1) AS `count`, `last_edit`,`goods`.`id`, `goods`.`cat`, `goods`.`idcompany`, `goods`.`pp`, `goods`.`pp_short`, `goods`.`tels_pp`, `goods`.`price`, `goods`.`currency`, `goods`.`date_add`, `firms`.`stadofreklam_access`, `firms`.`fullname`, `firms`.`brands`, `firms`.`tels_firm`, `firms`.`site`, `firms`.`icq`, `firms`.`skype`, `firms`.`tariff`, `firms`.`domain`, `firms`.`city`, `firms`.`logo`, `firms`.`mail`, `firms`.`mail_is_checked`, `areas`.`en`, `rubrics`.`name`, `users`.`email`, `goods_photo`.`width`, `goods_photo`.`height`, `goods_photo`.`name` AS `pic_name`, `users`.`activation`, `units`.`name` AS `units`, DATE_FORMAT(`goods`.`last_edit`, '%d.%m.%Y') AS `dateofupdate`
 FROM `goods`
    LEFT JOIN `firms` USING (`idcompany`)
    LEFT JOIN `users` USING (`idcompany`)
    LEFT JOIN `areas` ON (`areas`.`id` = `firms`.`area_id`)
    LEFT JOIN `rubrics` ON (`rubrics`.`id` = `goods`.`cat`)
    LEFT JOIN `units` ON (`units`.`id` = `goods`.`units`)
    LEFT JOIN `goods_photo` ON (`goods`.`id` = `goods_photo`.`building_id`)
 WHERE `goods`.`cat` = '3' AND (`firms`.`status` BETWEEN '4' AND '7') AND `firms`.`stadofreklam_access` != '22' AND `firms`.`theme_id` IN ('4', '8') AND `firms`.`manager_id` != '39' AND `goods`.`status` = '2'
 GROUP BY `idcompany` HAVING(MAX(`goods`.`last_edit`)) ORDER BY `last_edit` LIMIT 0, 20;
 


работает неправильно, в группировке выдает совершенно левый товар, а не тот, который имеет максимальную дату редактирования sad помогите советом как решить roll

Отредактированно tazododu (09.12.2010 11:37:21)

Неактивен

 

#9 09.12.2010 12:01:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

При использовании группировки необходимо выбирать только те столбцы, по которым идет группировка, или, для которых используется группирующая функция. Это стандарт SQL.
MySQL разрешает не соблюдать это правило (не выдает ошибку синтаксиса), но в группировке для тех столбцов, которые не входят в группировку (или не используются с группирующей функцией) выдает произвольную строку.

Вместо

SELECT * FROM goods GROUP BY `idcompany` HAVING(MAX(`goods`.`last_edit`));

нужно
SELECT g.* FROM goods g JOIN (SELECT (MAX(`goods`.`last_edit`)) as last_edit GROUP BY `idcompany`) t using(`idcompany`,last_edit);

Неактивен

 

#10 09.12.2010 12:04:57

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

Так пока и не нашел решения этой задачи, применительно к своему запросу, и решил пока не выводит на сайте общее число найденных товаров, мож ближе к новому году придет озарение

А почему бы на уровне языка программирования при обработке данных не суммировать всё полученное? Ведь всё равно в каком-то цикле все данные проходите wink

А для запроса всё же подзапрос надо бы использовать, ИМХО. Детали щас не подскажу, долго думать)))
upd.
Ой, не успел поумничать))

Отредактированно Neval (09.12.2010 12:05:49)


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#11 09.12.2010 13:25:45

tazododu
Завсегдатай
Зарегистрирован: 24.09.2010
Сообщений: 51

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

Neval
Так пока и не нашел решения этой задачи, применительно к своему запросу, и решил пока не выводит на сайте общее число найденных товаров, мож ближе к новому году придет озарение
А почему бы на уровне языка программирования при обработке данных не суммировать всё полученное? Ведь всё равно в каком-то цикле все данные проходите wink
---
та я бы с радостью, абы не LIMIT big_smile

vasya
нужно
 

SELECT g.* FROM goods g JOIN (SELECT (MAX(`goods`.`last_edit`)) as last_edit GROUP BY `idcompany`) t using(`idcompany`,last_edit);

---
Этой записью вы вообще меня запутали smile
Кверя не выполняется. Как это в подзапросе
SELECT (MAX(`goods`.`last_edit`)) as last_edit GROUP BY `idcompany`
нет FROM? Что за g перед джойном когда потом написано t..... я в замешательстве neutral

Отредактированно tazododu (09.12.2010 13:26:47)

Неактивен

 

#12 09.12.2010 13:35:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

tazododu написал:

vasya
нужно
 

SELECT g.* FROM goods g JOIN (SELECT (MAX(`goods`.`last_edit`)) as last_edit GROUP BY `idcompany`) t using(`idcompany`,last_edit);

---
Этой записью вы вообще меня запутали smile
Кверя не выполняется. Как это в подзапросе
SELECT (MAX(`goods`.`last_edit`)) as last_edit GROUP BY `idcompany`
нет FROM?

Забыл hmm Естественно нужен.


tazododu написал:

Что за g перед джойном когда потом написано t..... я в замешательстве neutral

У вас ведь 2 таблицы, одна goods g, вторая подзапрос.
Но в данном случае можно просто * написать.

Неактивен

 

#13 09.12.2010 13:39:39

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

tazododu написал:

та я бы с радостью, абы не LIMIT big_smile

Ну тогда отдельный запрос smile

tazododu написал:

Как это в подзапросе

SELECT (MAX(`goods`.`last_edit`)) as last_edit GROUP BY `idcompany`
нет FROM?

Это синтаксис из MySQL 10 big_smile

SELECT `g`.* FROM `goods` AS `g` JOIN (SELECT (MAX(`last_edit`)) AS `last_edit` FROM `goods` GROUP BY `idcompany`) AS `t` USING(`idcompany`,`last_edit`);

Должно вывести товары каждого `idcompany` с максимальной датой `last_edit`. Сюда правда можно ещё группировку или лимит добавить для случаев, когда при работе сотни манагеров данные могли обновиться в одно и то же время smile

upd.
Та что ж такое, опять опоздал big_smile

Отредактированно Neval (09.12.2010 13:40:37)


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#14 09.12.2010 13:42:06

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

Да, и в подзапросе по идее ещё надо `idcompany` селектить smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#15 09.12.2010 13:52:52

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

Точно.
Надо отдохнуть, а то я простой запрос уже который раз неправильно пишу.

Неактивен

 

#16 10.12.2010 16:25:40

tazododu
Завсегдатай
Зарегистрирован: 24.09.2010
Сообщений: 51

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

ТОВАРИЩИ!!!
Спасиб за помощь с GROUP BY!! Этот способ очень помог! Сейчас вот нужно как-то будет запросы и БД свои оптимизировать то медленнее стали выборки сразу sad

Возник вопрос, а зачем в USING(`idcompany`,`last_edit`) аж 2 параметра?
Сделал с одним ON (`goods`.`idcompany` = `t`.`idcompany`). Работает правильно....вродеsmile

Отредактированно tazododu (10.12.2010 17:19:17)

Неактивен

 

#17 10.12.2010 17:33:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

tazododu написал:

Возник вопрос, а зачем в USING(`idcompany`,`last_edit`) аж 2 параметра?
Сделал с одним ON (`goods`.`idcompany` = `t`.`idcompany`). Работает правильно....вродеsmile

mysql> select * from a;
+----+------+------+
| id | b    | c    |
+----+------+------+
|  1 |    1 |   11 |
|  2 |    1 |   12 |
|  3 |    2 |   21 |
|  4 |    2 |   22 |
|  5 |    3 |   33 |
+----+------+------+
5 rows in set (0.00 sec)


mysql> select * from a join (select b, max(c) from a group by b) t using(b);
+------+----+------+--------+
| b    | id | c    | max(c) |
+------+----+------+--------+
|    1 |  1 |   11 |     12 |
|    1 |  2 |   12 |     12 |
|    2 |  3 |   21 |     22 |
|    2 |  4 |   22 |     22 |
|    3 |  5 |   33 |     33 |
+------+----+------+--------+
5 rows in set (0.01 sec)

mysql> select * from a join (select b, max(c) c from a group by b) t using(b,c);

+------+------+----+
| b    | c    | id |
+------+------+----+
|    1 |   12 |  2 |
|    2 |   22 |  4 |
|    3 |   33 |  5 |
+------+------+----+
3 rows in set (0.00 sec)

Неактивен

 

#18 10.12.2010 18:04:54

tazododu
Завсегдатай
Зарегистрирован: 24.09.2010
Сообщений: 51

Re: Выборка кол-ва уникальных строк при использовании GROUP BY

Да, наглядно! Чую как от общения с вами прокачиваюсь в мускуле smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson