Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Помогите дописать запрос, JOIN
maximka787  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1228
Пользователь №: 2705
На форуме: 9 лет, 3 месяца, 26 дней
Карма: 1




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

Суть, вывести данные из 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 сервера.


--------------------
..Работает - не трогай!
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 7 дней
Карма: 40




Верхний запрос неправильный, нерабочий.


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TranceIT  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



...Один я одинаковый...
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1731
Пользователь №: 19760
На форуме: 7 лет, 17 дней
Карма: 58




LEFT JOIN `brands` t2 ON t2.`id` = t1.`brand`

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


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

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

user posted image
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maximka787  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1228
Пользователь №: 2705
На форуме: 9 лет, 3 месяца, 26 дней
Карма: 1




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

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

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

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


--------------------
..Работает - не трогай!
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TranceIT  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



...Один я одинаковый...
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1731
Пользователь №: 19760
На форуме: 7 лет, 17 дней
Карма: 58




maximka787
Текст ошибки в студию.


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

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

user posted image
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 7 дней
Карма: 40




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

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


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 7 дней
Карма: 40




Цитата (maximka787 @ 17.11.2016 - 14:18)
Цитата
Верхний запрос неправильный, нерабочий.

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

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

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


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maximka787  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1228
Пользователь №: 2705
На форуме: 9 лет, 3 месяца, 26 дней
Карма: 1




/* 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`


--------------------
..Работает - не трогай!
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 7 дней
Карма: 40




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


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 7 дней
Карма: 40




По структуре.
1) Откажитесь от MyISAM. И затем забудьте про его существование.
2) Добавьте в statistics индекс по полю product. И тогда возможно запрос с подзапросом устроит Вас по скорости.


--------------------
PM
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maximka787  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1228
Пользователь №: 2705
На форуме: 9 лет, 3 месяца, 26 дней
Карма: 1




Цитата (S.Chushkin @ 17.11.2016 - 12:32)
По структуре.
1) Откажитесь от MyISAM. И затем забудьте про его существование.
2) Добавьте в statistics индекс по полю product. И тогда возможно запрос с подзапросом устроит Вас по скорости.

Дамп в данном случае не очень важное имеет значение. Тут вопрос в грамматической ошибке написания LEFT JOIN запроса, который я никак не допишу. Можете конкретно по нему подсказать, что в нем не так?
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`


#1064 - You have an error in your SQL syntax


--------------------
..Работает - не трогай!
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maximka787  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1228
Пользователь №: 2705
На форуме: 9 лет, 3 месяца, 26 дней
Карма: 1




Цитата (S.Chushkin @ 17.11.2016 - 12:32)
2) Добавьте в statistics индекс по полю product. И тогда возможно запрос с подзапросом устроит Вас по скорости.

О!, добавил индекс к полю product в таблицу статистики, скорость в разы выросла, но все равно на 6.000 товаров и 96.000 записей статистики уходит время 0,1 сек, объемы вроде бы небольшие, а уже думает. Это нормально?


--------------------
..Работает - не трогай!
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 7 дней
Карма: 40




1) Важен для создания оптимального запроса.
В остальном мне не интересно его писать, ибо запрос примитивен.
2) Я же говорил выше, Ваш запрос неправильный.
Допустимо только так:
SELECT 
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`

иначе получите данные "от балды".

Кроме того, поля "pro" нет в таблице. Или Вы дали неправильное описание структуры.

3) И вообще, этот запрос неправильный и по логике того, что Вам нужно.


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 7 дней
Карма: 40




В общем, не хотите давать дамп - Ваше дело.
Просто добавьте индекс, - это решит Вашу проблему, проблему скорости.


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 7 дней
Карма: 40




Цитата (maximka787 @ 17.11.2016 - 18:16)
Это нормально?

Да.


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса