[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите дописать запрос
maximka787
Мужики, всем привет. Понимаю глупый вопрос, но все же. Подскажите, чет не догоняю. Как написать запрос верно.

Суть, вывести данные из 2х таблиц ID, название товара, бренд и количество этого товара из таблицы статистика

product (`id`,`name`) - таблица товары
brand (`id`,`name`) - таблица бренды
statistics (`id`,`procuct`,`date`) - таблица посещаемости.

SELECT 
t1.`id`,
t1.`name`,
t2.`name` AS brand,
COUNT(t3.`pro`) AS cnt
FROM `product` t1
LEFT JOIN `brands` t2 ON t2.`id` = t1.`brand`
lEFT JOIN `statistics` t3 ON t3.`product` = t1.`id` GROUP BY t3.`pro`

Ранняя версия запроса выглядела так
SELECT 
`product`.`id`,
`product`.`name`,
`brand`.`name` AS brand_name,
(
SELECT count(*) FROM `statistics` WHERE `statistics`.`product` = `product`.`id`) AS cnt
FROM `product`, `brand`
Но со временем начала жутко тормозить, вплоть до перезагрузки mysq сервера.

_____________
..Работает - не трогай!
S.Chushkin
Верхний запрос неправильный, нерабочий.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
TranceIT
LEFT JOIN `brands` t2 ON t2.`id` = t1.`brand`

Если t1 это алиас для таблицы product, то в ней нет поля brand.

_____________
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
maximka787
Цитата
Верхний запрос неправильный, нерабочий.

Я знаю, что он не рабочий) Я его и хочу доделать, чтоб работал.

Цитата
Если t1 это алиас для таблицы product, то в ней нет поля brand.

Если более точно, то второй запрос работает(л) как надо. Но на 10.000+ записях в начинает виснуть, то есть он не оптимизирован. В помощью JOIN я и хотел его переделать, но запутался в грамматике, и выдает ошибку(

_____________
..Работает - не трогай!
TranceIT
maximka787
Текст ошибки в студию.

_____________
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
S.Chushkin
Цитата (maximka787 @ 17.11.2016 - 14:18)
Я его и хочу доделать, чтоб работал.

Выложите дамп, я сделаю оптимальный запрос.
Ссылку можно в личку, если секретно.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
S.Chushkin
Цитата (maximka787 @ 17.11.2016 - 14:18)
Цитата
Верхний запрос неправильный, нерабочий.

Я знаю, что он не рабочий)

Предполагаю, что не знаете.

Запомните, - если применяете GROUP BY, то в списке возвращаемых значений/полей могут быть только поля, перечисленные в GROUP BY и групповые функции.
MySQL позволяет там писать любые поля, но не гарантирует правильность их значений. Т.е. значения в них будут от балды.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
maximka787
/* 1 */
CREATE TABLE `brand` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

INSERT INTO `brand` VALUES (1, 'Бренд1');
INSERT INTO `brand` VALUES (2, 'Бренд2');

/* 2 */
CREATE TABLE `product` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(100) NOT NULL,
`brand` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

INSERT INTO `product` VALUES (1, 'Товар1', 1);
INSERT INTO `product` VALUES (2, 'Товар2', 2);

/* 3 */
CREATE TABLE `statistics` (
`id` int(10) unsigned NOT NULL auto_increment,
`product` int(10) unsigned NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

INSERT INTO `statistics` VALUES (1, 1, '2016-11-17');
INSERT INTO `statistics` VALUES (2, 1, '2016-11-17');
INSERT INTO `statistics` VALUES (3, 2, '2016-11-15');

/* Рабочий запрос */
SELECT
`product`.`id`,
`product`.`name`,
`brand`.`name` AS brand_name,
(
SELECT count(`statistics`.`product`) FROM `statistics` WHERE `statistics`.`product` = `product`.`id`) AS cnt
FROM `product`, `brand`
WHERE `product`.`brand` = `brand`.`id`


/* НОВЫЙ Нерабочий запрос */
SELECT
t1.`id`,
t1.`name`,
t2.`name` AS brand,
COUNT(t3.`pro`) AS cnt
FROM `product` t1
LEFT JOIN `brands` t2 ON t2.`id` = t1.`brand`
lEFT JOIN `statistics` t3 ON t3.`product` = t1.`id` GROUP BY t3.`pro`


_____________
..Работает - не трогай!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.