powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Проблема с подзапросом
8 сообщений из 8, страница 1 из 1
Проблема с подзапросом
    #39653421
kryuch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Имеется следующий запрос:

[src]SELECT `e`.*, COUNT(soit.*) AS `total`

FROM `catalog_category_entity` AS `e`

LEFT JOIN `sales_flat_order_item` AS `soit` ON soit.product_id in ( SELECT product_id from catalog_category_product where category_id=e.entity_id )

LEFT JOIN `webxmore_wbxquestions_item_info` AS `woiit` ON woiit.attribute = 1 and woiit.owner in (SELECT item_id from sales_flat_order_item where product_id in ( select product_id from catalog_category_product where category_id=e.entity_id ) )

GROUP BY `e`.`entity_id`

Проблема в том, что выделенный курсивом подзапрос вызывается 2 раза и из-за этого COUNT(soit.*) возводится в квадрат (вместо 13, например, возвращает 169). Буду благодерен за подсказку, как можно переписать этот запрос (внятный вопрос гуглу я не смог сформулировать)
...
Рейтинг: 0 / 0
Проблема с подзапросом
    #39653674
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите:

- скрипты создания таблиц (SHOW CREATE TABLE в теге SRC)
- пример наполнения таблиц (в теге Table, разделитель запятая)
- сформулируйте полно и точно исходную задачу
- покажите (в теге Table) желаемый результат (именно на показанном примере наполнения) с объяснением, почему именно так.
...
Рейтинг: 0 / 0
Проблема с подзапросом
    #39653696
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kryuchПроблема в том, что выделенный курсивом подзапрос вызывается 2 раза проблема не в этом. проблема в том, что таблицы связаны не один-к-одному, а один-ко-многим. Поэтому изменить логику запроса - сначала считать агрегаты и только после этого делать джойн. Либо, заменить left join-ы на IN/EXISTS-подзапросы...
...
Рейтинг: 0 / 0
Проблема с подзапросом
    #39653708
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна , да связь таблиц по коррелированному подзапросу - вообще веселуха. Думаю, там логика кривая, и запрос вообще надо с нуля перерисовывать.
...
Рейтинг: 0 / 0
Проблема с подзапросом
    #39653861
kryuch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Структура такая:
1) Категории
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE catalog_category_entity (
  `entity_id` int(10) unsigned NOT NULL auto_increment,
  `entity_type_id` smallint(8) unsigned NOT NULL default '0',
  `attribute_set_id` smallint(5) unsigned NOT NULL default '0',
  `parent_id` int(10) unsigned NOT NULL default '0',
  `store_id` smallint(5) unsigned NOT NULL default '0',
  `created_at` datetime NOT NULL default '0000-00-00 00:00:00',
  `updated_at` datetime NOT NULL default '0000-00-00 00:00:00',
  `is_active` tinyint(1) unsigned NOT NULL default '1',
  PRIMARY KEY  (`entity_id`),
  KEY `FK_catalog_category_ENTITY_ENTITY_TYPE` (`entity_type_id`),
  KEY `FK_catalog_category_ENTITY_STORE` (`store_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Category Entities';



2) Отношение товаров к категория
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLEcatalog_category_product (
  `category_id` int(10) unsigned NOT NULL default '0',
  `product_id` int(10) unsigned NOT NULL default '0',
  `position` int(10) unsigned NOT NULL default '0',
  KEY `CATALOG_CATEGORY_PRODUCT_CATEGORY` (`category_id`),
  KEY `CATALOG_CATEGORY_PRODUCT_PRODUCT` (`product_id`),
  CONSTRAINT `CATALOG_CATEGORY_PRODUCT_CATEGORY` FOREIGN KEY (`category_id`) REFERENCES {$this->getTable('catalog_category_entity')} (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `CATALOG_CATEGORY_PRODUCT_PRODUCT` FOREIGN KEY (`product_id`) REFERENCES {$this->getTable('catalog_product_entity')} (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



3) Заказы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE `sales_flat_order_item` (
    `item_id` int(10) unsigned NOT NULL auto_increment,
......
   product_id` int(10) unsigned default NULL,
  ......
    PRIMARY KEY (`item_id`),
    KEY `IDX_ORDER` (`order_id`),
    KEY `IDX_STORE_ID` (`store_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



4) Свойства заказов (связана с заказами полем owner - item_id из таблицы заказов)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table webxmore_wbxquestions_item_info (
    id int not null auto_increment,
    number int,
     field varchar(255),
    comment text,
    attribute int,
    description varchar(1024),
        owner int,
    primary key(id)) CHARACTER SET utf8;



В этом запросе мы хотим получить все категории и по каждой количество заказов обладающих определенным свойством (attribute = 1), + общее количество заказов.


Про агрегаты - тоже думал. Но по сути надо делать функцию которая возвращает массив
...
Рейтинг: 0 / 0
Проблема с подзапросом
    #39653911
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Навскидку как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT c.entity_id
     , COUNT(DISTINCT p.item_id) total
     , COUNT(DISTINCT CASE WHEN pa.attribute = 1 THEN p.item_id END) `with attribute=1`
FROM catalog_category_entity c
JOIN catalog_category_product cp ON c.entity_id = cp.category_id
JOIN sales_flat_order_item p ON cp.id = p.product_id
JOIN webxmore_wbxquestions_item_info pa ON p.item_id = pa.owner
...
Рейтинг: 0 / 0
Проблема с подзапросом
    #39653914
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, последнюю связь придётся делать LEFT JOIN... вдруг у товара нет ни одной категории.
...
Рейтинг: 0 / 0
Проблема с подзапросом
    #39653916
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин... GROUP BY забыл. Сорри.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT c.entity_id
     , COUNT(DISTINCT p.item_id) total
     , COUNT(DISTINCT CASE WHEN pa.attribute = 1 THEN p.item_id END) `with attribute=1`
FROM catalog_category_entity c
JOIN catalog_category_product cp ON c.entity_id = cp.category_id
JOIN sales_flat_order_item p ON cp.id = p.product_id
/* LEFT */ JOIN webxmore_wbxquestions_item_info pa ON p.item_id = pa.owner
GROUP BY c.entity_id
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Проблема с подзапросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]