X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Выборка по 2 талицам с подсчётом значений
Den1xxx
Den1xxx
Topic Starter сообщение 15.3.2015, 9:57; Ответить: Den1xxx
Сообщение #1


Делаю выборку количества товаров в каждой из категорий в MySQL:
SELECT `catid`, COUNT(`catid`) AS cnt FROM `items` GROUP BY `catid`

Выходит, но совсем кошерно было бы дёргать ещё название этой категории из таблицы categories.
Там поле id соответствует полю catid таблицы items
Как это сделать одним запросом?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Azazaza_hb
Azazaza_hb
сообщение 15.3.2015, 12:32; Ответить: Azazaza_hb
Сообщение #2


может так
SELECT `items.catid`, `categories.name`, COUNT(`items.catid`) AS cnt FROM `items` JOIN `categories` ON `items.catid` = `categories.id`
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
Den1xxx
Topic Starter сообщение 15.3.2015, 19:57; Ответить: Den1xxx
Сообщение #3


Спасибо, почти так.
Только надо было добавить ещё GROUP BY и сущности пишутся не `items.catid`, а `items`.`catid`
SELECT `items`.`catid`, `categories`.`name`, COUNT(`items`.`catid`) AS cnt
FROM `items` JOIN `itemcat` ON `items`.`catid` = `categories`.`id`
GROUP BY `items`.`catid`
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 19.3.2015, 23:49; Ответить: Arks
Сообщение #4


Тестовые данные:
MariaDB [(none)]> CREATE DATABASE test CHARACTER SET 'utf8';
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> use test;
Database changed

MariaDB [test]> CREATE TABLE categories (id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> CREATE TABLE items (id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, catid INT(10) UNSIGNED NOT NULL, KEY(catid), PRIMARY KEY(id), CONSTRAINT FOREIGN KEY (catid) REFERENCES categories (id) ON DELETE RESTRICT) ENGINE=InnoDB;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> INSERT INTO categories (name) VALUES ('телефоны'), ('планшеты');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

MariaDB [test]> INSERT INTO items (name, catid) VALUES ('samsung', 1), ('lenovo', 1), ('iphone', 1), ('ipad', 2), ('ASUS', 2), ('ACER', 2), ('EXPLAY', 2);
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0

MariaDB [test]> DELETE FROM categories; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`items`, CONSTRAINT `items_ibfk_1` FOREIGN KEY (`catid`) REFERENCES `categories` (`id`))

MariaDB [test]> SELECT c.*, COUNT(p.id) as products_count FROM categories c JOIN items p ON c.id = p.catid GROUP BY c.id\G;
*************************** 1. row ***************************
id: 1
name: телефоны
products_count: 3
*************************** 2. row ***************************
id: 2
name: планшеты
products_count: 4
2 rows in set (0.00 sec)


Подключаем push-технологию вместо pull (делаем materialized view)
MariaDB [test]> CREATE TABLE categories_aggregate (id INT(10) UNSIGNED NOT NULL, products_count INT(10) UNSIGNED NOT NULL, KEY(products_count), PRIMARY KEY(id), CONSTRAINT FOREIGN KEY (id) REFERENCES categories (id) ON DELETE CASCADE) ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> LOCK TABLE categories WRITE, categories_aggregate WRITE, items WRITE;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> INSERT INTO categories_aggregate SELECT categories.id, COUNT(items.id) FROM categories JOIN items ON categories.id = items.catid GROUP BY categories.id;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

MariaDB [test]> SELECT * FROM categories_aggregate\G;
*************************** 1. row ***************************
id: 1
products_count: 3
*************************** 2. row ***************************
id: 2
products_count: 4
2 rows in set (0.00 sec)

MariaDB [test]> CREATE TRIGGER insert_items AFTER INSERT ON items FOR EACH ROW UPDATE categories_aggregate SET products_count = products_count+1 WHERE id = NEW.catid;
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> CREATE TRIGGER delete_items AFTER DELETE ON items FOR EACH ROW UPDATE categories_aggregate SET products_count = products_count-1 WHERE id = OLD.catid;
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> INSERT INTO items (name, catid) VALUES ('HUAWEI', 2);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> SELECT * FROM categories_aggregate\G;
*************************** 1. row ***************************
id: 1
products_count: 3
*************************** 2. row ***************************
id: 2
products_count: 5
2 rows in set (0.00 sec)

MariaDB [test]> DELETE FROM items WHERE name = 'ipad';
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> SELECT * FROM categories_aggregate\G;
*************************** 1. row ***************************
id: 1
products_count: 3
*************************** 2. row ***************************
id: 2
products_count: 4
2 rows in set (0.00 sec)


:goodpost:
P.S. наверное еще нехватает уникального индекса по items (name, catid)

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Нужна выборка из базы пастухова
2 aleggator 2196 2.3.2017, 15:19
автор: aleggator
Открытая тема (нет новых ответов) Выборка ключевых слов. База почти 2 млрд.
200р./ выборка
19 zhurik 16175 21.10.2015, 8:29
автор: zhurik
Открытая тема (нет новых ответов) Выборка по базе ключевых слов
3 aleggator 2109 20.8.2015, 12:29
автор: metvekot
Открытая тема (нет новых ответов) Требуется выборка из базы Пастухова
5 frion-seo 4052 20.1.2015, 22:58
автор: Вентилятор
Открытая тема (нет новых ответов) Выборка по базе Пастухова
Сделаю выборку ваших кеев по базе Пастухова. База РУ февраль 2012
17 ivando 6831 4.7.2012, 21:43
автор: ivando


 



RSS Текстовая версия Сейчас: 19.4.2024, 4:12
Дизайн