SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 31.10.2011 20:38:09

SanyaGarik
Завсегдатай
Зарегистрирован: 25.10.2011
Сообщений: 26

count() из 2 таблиц

Добрый день. По какой- то причине такой запрос работает:
SELECT `sellers`.id, `sellers`.name, `sellers`.city, count(`prices`.seller_id) as c1
                                                                  
            FROM `sellers`, `prices`
            WHERE `sellers`.id= `prices`.seller_id  group by `sellers`.id

А такой нет:
SELECT `sellers`.id, `sellers`.name, `sellers`.city, count(`prices`.seller_id) as c1,
                                                                     count(`import_report`.seller_id) as c2
                                                                  
            FROM `sellers`, `prices`, `import_report`
            WHERE `sellers`.id= `prices`.seller_id AND `sellers`.id= `import_report`.seller_id  group by `sellers`.id

Никаких ошибок не выводится, mysql просто зависает

Неактивен

 

#2 31.10.2011 23:34:42

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: count() из 2 таблиц

Подозреваю, что не хватает ключей на тех полях, по которым проводится соединение.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 01.11.2011 00:36:39

SanyaGarik
Завсегдатай
Зарегистрирован: 25.10.2011
Сообщений: 26

Re: count() из 2 таблиц

ключи есть, или может такие запросы надо писать через inner join, или как то иначе?

Неактивен

 

#4 01.11.2011 00:39:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: count() из 2 таблиц

Можно через join, можно и так, как Вы составили запрос. Покажите explain запроса и show create table на все таблицы.  К слову, сколько в каждой из таблиц записей?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 01.11.2011 01:02:22

SanyaGarik
Завсегдатай
Зарегистрирован: 25.10.2011
Сообщений: 26

Re: count() из 2 таблиц

CREATE TABLE `sellers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
  `url` varchar(128) NOT NULL,
  `products` varchar(128) NOT NULL,
  `status` varchar(32) NOT NULL,
  `description` text NOT NULL,
  `date` date NOT NULL,
  `delivery_time` varchar(128) DEFAULT NULL,
  `markup` decimal(5,2) NOT NULL DEFAULT '0.00',
  `markup_type` tinyint(1) NOT NULL DEFAULT '0',
  `use_for_dealers_prices` enum('Yes','No') NOT NULL DEFAULT 'No',
  `city` varchar(128) NOT NULL,
  `email` varchar(128) NOT NULL,
  `phone` varchar(128) NOT NULL,
  `manager` varchar(256) NOT NULL,
  `show_on_site` enum('Yes','No') NOT NULL DEFAULT 'No',
  `balance` decimal(7,2) NOT NULL,
  `delivery_payment` text NOT NULL,
  `price_correction` decimal(5,2) NOT NULL COMMENT 'Корректировка цены поставщика',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=778 DEFAULT CHARSET=utf8

CREATE TABLE `prices` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL,
  `card_id` varchar(128) DEFAULT NULL,
  `seller_id` int(11) NOT NULL,
  `price` int(11) NOT NULL,
  `source_price` int(11) NOT NULL,
  `amount` smallint(6) NOT NULL,
  `currency` enum('UAH','USD','EUR') NOT NULL DEFAULT 'UAH',
  `source_price_currency` enum('UAH','USD','EUR') NOT NULL DEFAULT 'UAH',
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `pre_order` enum('да','нет') NOT NULL DEFAULT 'нет',
  `country` int(11) NOT NULL DEFAULT '0',
  `info` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `product_id` (`product_id`),
  KEY `seller_id` (`seller_id`),
  KEY `card_id` (`card_id`)
) ENGINE=MyISAM AUTO_INCREMENT=104908 DEFAULT CHARSET=utf8


CREATE TABLE `import_report` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `seller_id` int(11) NOT NULL,
  `card` varchar(128) NOT NULL,
  `tyre_params` varchar(256) NOT NULL COMMENT 'brand|model|width|profile|r|season|load_rating|speed_rating|country_id',
  `status` int(2) NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `seller_id` (`seller_id`)
) ENGINE=MyISAM AUTO_INCREMENT=10900 DEFAULT CHARSET=utf8


sellers- 80 , prices- 81000, import_report- 10000 записей




explain SELECT `sellers`.id, `sellers`.name, `sellers`.city, count(`prices`.seller_id) as c1
                                                                 
            FROM `sellers`, `prices`
            WHERE `sellers`.id= `prices`.seller_id  group by `sellers`.id
1    SIMPLE    sellers    ALL    PRIMARY                79    Using temporary; Using filesort
1    SIMPLE    prices    ref    seller_id    seller_id    4    www120ua.sellers.id    53    Using index

Отредактированно SanyaGarik (01.11.2011 01:06:44)

Неактивен

 

#6 01.11.2011 01:04:50

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: count() из 2 таблиц

Приведите пожалуйста еще explain запроса, который зависает. И посмотрите через show full processlist что с ним происходит - в каком состоянии он находится?

Отредактированно deadka (01.11.2011 01:05:09)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 01.11.2011 01:08:16

SanyaGarik
Завсегдатай
Зарегистрирован: 25.10.2011
Сообщений: 26

Re: count() из 2 таблиц

explain SELECT `sellers`.id, `sellers`.name, `sellers`.city, count(`prices`.seller_id) as c1,
                                                                     count(`import_report`.seller_id) as c2
                                                                 
            FROM `sellers`, `prices`, `import_report`
            WHERE `sellers`.id= `prices`.seller_id AND `sellers`.id= `import_report`.seller_id  group by `sellers`.id

1    SIMPLE    import_report    index    seller_id    seller_id    4        10717    Using index; Using temporary; Using filesort
1    SIMPLE    sellers    eq_ref    PRIMARY    PRIMARY    4    www120ua.import_report.seller_id    1   
1    SIMPLE    prices    ref    seller_id    seller_id    4    www120ua.sellers.id    53    Using where; Using index

Неактивен

 

#8 01.11.2011 01:10:15

SanyaGarik
Завсегдатай
Зарегистрирован: 25.10.2011
Сообщений: 26

Re: count() из 2 таблиц

а вот запустился запрос на компе помощнее, но сильно долго выполняется
2    root    localhost:50066    www120ua    Sleep    10050       
3    root    localhost:50905    www120ua    Sleep    530       
9    root    localhost:50962    www120ua    Query    0        show full processlist
10    root    localhost:50967    www120ua    Sleep    555       
11    root    localhost:50968    www120ua    Sleep    530       
12    root    localhost:51002    www120ua    Sleep    263

Можно ли как то оптимизировать запрос, чтобы он быстрее выполнялся? или только разделить на два?

Отредактированно SanyaGarik (01.11.2011 01:15:08)

Неактивен

 

Board footer

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