Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Баг в запросе 
:(
    Опции темы
aktuba
Дата 5.3.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Есть такой запрос:
Код

    
                SELECT
                    p.id,
                    stat_1.hosts AS hosts1,
                    stat_1.hits AS hits1,
                    stat_2.hosts AS hosts2,
                    stat_2.hits AS hits2,
                    SUM(stat_3.hosts) AS hosts3,
                    SUM(stat_3.hits) AS hits3,
                    SUM(stat_4.hosts) AS hosts4,
                    SUM(stat_4.hits) AS hits4,
                    SUM(stat_5.hosts) AS hosts5,
                    SUM(stat_5.hits) AS hits5,
                    SUM(stat_6.hosts) AS hosts6,
                    SUM(stat_6.hits) AS hits6
                FROM
                    tbl_projects AS p
                    LEFT JOIN tbl_advert_stat AS stat_1 ON
                            stat_1.project_id = p.id AND
                            stat_1.dt = "2010-03-05"
                    LEFT JOIN tbl_advert_stat AS stat_2 ON
                            stat_2.project_id = p.id AND
                            stat_2.dt = SUBDATE("2010-03-05", INTERVAL 1 DAY)
                    LEFT JOIN tbl_advert_stat AS stat_3 ON
                            stat_3.project_id = p.id
                    LEFT JOIN tbl_advert_stat AS stat_4 ON
                            stat_4.project_id = p.id AND
                            stat_4.dt >= "2010-03-01" AND
                            stat_4.dt <= "2010-03-05"
                    LEFT JOIN tbl_advert_stat AS stat_5 ON
                            stat_5.project_id = p.id AND
                            stat_5.dt >= "2010-02-01" AND
                            stat_5.dt <= "2010-02-28"
                    LEFT JOIN tbl_advert_stat AS stat_6 ON
                            stat_6.project_id = p.id AND
                            stat_6.dt >= "2010-03-01" AND
                            stat_6.dt <= "2010-03-05"
                WHERE
                    p.id IN (2)
                GROUP BY
                    p.id 


В базе только одна запись за 05.03.2010. В теории, stat_1.hosts должен быть равен stat_4.hosts. Но это только в теории. А вот в результате:

hosts1    2288
hits1    69172
hosts2    0
hits2    0
hosts3    9152
hits3    276688
hosts4    128128
hits4    3873632
hosts5    NULL
hits5    NULL
hosts6    128128
hits6        3873632

Изначально казалось, что цифры вообще с потолка... Но, если присмотреться, можно заметить вот такую закономерность:

hosts3 = hosts1 * 4
hits3 = hits1 * 4
hosts4 = hosts3 * 14
hits4 = hits3 * 14

Т.е., следующие данные зависят от предыдущих. И вот этого я понять не могу - почему запрос работает так? Почему он не работает так, как должен в теории? Помогите plz разобраться и составить правильный запрос...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Zloxa
Дата 5.3.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(aktuba @  5.3.2010,  22:53 Найти цитируемый пост)
 не работает так, как должен в теории

Не утверждайте, что нашли ошибку
Вам следует переоценить степень своего владения "теорией".
Не понятно одно - Вы  действительно хотите чтобы вам на форуме объяснили как работает join лучше чем это написано в книшке вроде "SQL для чайников"?
Цитата(aktuba @  5.3.2010,  22:53 Найти цитируемый пост)
Почему

Если мы соединяем три набора данных. В одном одна запись, в другом две, в третьем три - сколько должно быть записей  в результате? 1*2*3=6. Т.е. каждая запись каждого из набора будет сочетаться с каждой записью другого набора.  и если мы будем применять аггрегат к полям второго набора, надо быть готовым, что он умножится на 3 и  на 1 - количества записей в первом и третьем наборе.

уберите группировку, посмотрите что имеете в результате объединения.
Цитата(aktuba @  5.3.2010,  22:53 Найти цитируемый пост)
составить правильный запрос... 

Описывайте цель, а не отдельный шаг
Приведенный вами запрос написан на формальном языке и безошибочен. Он вполне соответствует понятию "правильный". Судя по всему он дает не правильный результат, но Вы ж, мля нихрена не сказали о том, какой результат по Вашему должен быть правильным! smile  Видимо, для вас это очевидно, а стало быть лишь сиречь тупой не постигнет великую мысль высокородного дона.

Код

select
  p.id
  ,sum(case when s.dt = "2010-03-05" then s. hosts end) hosts1
  ,sum(case when s.dt = "2010-03-05" then s. hits end) hits1
  ,sum(case when s.dt = SUBDATE("2010-03-05", INTERVAL 1 DAY) then s. hosts end) hosts2
  ,sum(case when s.dt = SUBDATE("2010-03-05", INTERVAL 1 DAY) then s. hits end) hits2
.
.
.
               FROM
                    tbl_projects AS p
                    LEFT JOIN tbl_advert_stat s
                        ON  s.project_id = p.id
               WHERE
                    p.id IN (2)
                GROUP BY
                    p.id 


Это сообщение отредактировал(а) Zloxa - 8.3.2010, 00:16


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
aktuba
Дата 6.3.2010, 00:40 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Цитата(Zloxa @  6.3.2010,  00:30 Найти цитируемый пост)
Если мы соединяем три набора данных. В одном одна запись, в другом две, в третьем три - сколько должно быть записей  в результате? 1*2*3=6. Т.е. каждая запись каждого из набора будет сочетаться с каждой записью другого набора.  и если мы будем применять аггрегат к полям второго набора, надо быть готовым, что он умножится на 3 и  на 1 - количества записей в первом и третьем наборе.


Так может стоит прочесть, что было написано изначально:

Цитата(aktuba @  5.3.2010,  23:53 Найти цитируемый пост)
В базе только одна запись за 05.03.2010.


Но, даже есть идти по вашим рассуждениям - почему ДАННЫЕ(!!!) должны перемножаться? При чем тут разное количество записей?


Цитата(Zloxa @  6.3.2010,  00:30 Найти цитируемый пост)
уберите группировку, посмотрите что имеете в результате.


Без группировки запрос вообще работать не будет... Можно даже не проверять.

Цитата(Zloxa @  6.3.2010,  00:30 Найти цитируемый пост)
Описывайте цель, а не отдельный шаг


Цель простая - получить данные для "проектов" за разные промежутки времени. Проектов может быть много, промежутков - 6. Делать запросы в цикле считаю неразумным... Поэтому и сделал через join-ы, но тут какая-то непонятная засада...


Цитата(Zloxa @  6.3.2010,  00:30 Найти цитируемый пост)
Приведенный вами запрос написан на формальном языке и безошибочен. Он вполне соответствует понятию "правильный". Судя по всему он дает не правильный результат, но Вы ж, мля нихрена не сказали о том, какой результат по Вашему должен быть правильным!


Как это не сказал? А это что тогда???

Цитата(aktuba @  5.3.2010,  23:53 Найти цитируемый пост)
В теории, stat_1.hosts должен быть равен stat_4.hosts. Но это только в теории. А вот в результате:

hosts1    2288
hits1    69172
hosts2    0
hits2    0
hosts3    9152
hits3    276688
hosts4    128128
hits4    3873632
hosts5    NULL
hits5    NULL
hosts6    128128
hits6        3873632



Цитата(Zloxa @  6.3.2010,  00:30 Найти цитируемый пост)
Видимо, для вас это очевидно, а стало быть лишь сиречь тупой не постигнет великую мысль высокородного дона.


Видимо, у кого-то плохое настроение... Может тогда лучше пойти поспать, чем ахинею всякую нести???

P.S.: а за запрос - СПАСИБО! Работает, вроде, как надо... Но хотелось бы все-же понять, что не так в моем запросе...

Это сообщение отредактировал(а) aktuba - 6.3.2010, 00:50


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Zloxa
Дата 6.3.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(aktuba @  6.3.2010,  00:40 Найти цитируемый пост)
почему ДАННЫЕ(!!!) должны перемножаться?

ДУМАЙ, БЛИН!!!!
Я расписал. 
Если у тебя число "два", в результате джойна "размножилось" на три строки, сколько ты получишь суммируя все строки с числом "два"? 
Цитата(aktuba @  6.3.2010,  00:40 Найти цитируемый пост)
В базе только одна запись за 05.03.2010.

а сколько записей за 04.03.10, dt >= "2010-03-01" AND dt <= "2010-03-05" и т.д.

Цитата(aktuba @  6.3.2010,  00:40 Найти цитируемый пост)
Без группировки запрос вообще работать не будет...

п-п-ц. убрать груп бай, закоментить селект лист и поставить там жирную звездочку и изучить что ж ты группируешь - высшая математика -  не для среднего ума.
Цитата(aktuba @  6.3.2010,  00:40 Найти цитируемый пост)
Можно даже не проверять.

как будто бы мне это надо. 

Это сообщение отредактировал(а) Zloxa - 6.3.2010, 11:24


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
aktuba
Дата 6.3.2010, 20:32 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Цитата(Zloxa @  6.3.2010,  12:12 Найти цитируемый пост)
а сколько записей за 04.03.10, dt >= "2010-03-01" AND dt <= "2010-03-05" и т.д.


Да блин! Написал же - ТОЛЬКО ОДНА ЗАПИСЬ В БАЗЕ! И дата этой записи - 05.03.10. ВСЕ! Нет больше записей.

Цитата(Zloxa @  6.3.2010,  12:12 Найти цитируемый пост)
п-п-ц. убрать груп бай, закоментить селект лист и поставить там жирную звездочку и изучить что ж ты группируешь - высшая математика -  не для среднего ума.


Охрененный ответ. Спасибо, млять... Лучше бы ты вообще ничего не писал, чем так... Как по твоему - почему люди приходят на форум и задают вопросы? Они что, БЛЯТЬ, должны всё на свете знать??? Сможешь перебрать боллид F1? Это же так просто - открутить пару тысяч гаек и закрутить потом! НАХРЕНА нужны такие ответы, как твои???


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 7.3.2010, 11:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(aktuba @  6.3.2010,  21:32 Найти цитируемый пост)
Написал же - ТОЛЬКО ОДНА ЗАПИСЬ В БАЗЕ! И дата этой записи - 05.03.10. ВСЕ! Нет больше записей.

Не "одна запись в базе", а одна запись в таблице.
Если таблицу, где есть одна запись, сджойнить с таблицей, где этой записи соответствуют несколько - в результирующем наборе будет несколько записей. И при группировке получим кратное умножение. В твоём частном случае это 56 - это произведение количества записей в остальных таблицах, которые соответствуют этой твоей "одной записи".
Имея статус "смышлёный", можно было бы это понять и из предыдущих сообщений.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 7.3.2010, 15:33 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(aktuba @  6.3.2010,  20:32 Найти цитируемый пост)
 НАХРЕНА нужны такие ответы, как твои??? 

Чтобы таких вопросов, как твои, впредь было меньше.
Чтобы в твоих вопросах впредь было меньше типовых ошибок вопрошающих.
Чтобы задавая вопрос, ты, впредь думал не о самолюбовании, мол "я тут такой крутой перец,  все по науке делаю, а оно - гуано бажное", а когда тебе предлагают что то попробовать, выпендрежно заявлять "не стоит и пытаться".
Чтобы задавая вопрос, ты, впредь, проявлял уважение к отвечающим, позаботившись о достаточности материала для ответа.
Чтобы задавая дополнительный вопрос впредь ты бы убедился, что ответа на него действительно не было в предыдущем ответе.
Чтобы получив ответ, ты хотябы попытался понять, что именно тебе пытались донести.

Когда я тебе предложил убрать группировку, если ты не понял как это сделать, наверное следовало бы о том спросить, а не высокомерно утверждать что мое предложение абсурдно. В этом контексте, по твоему, я c тобой был не адекватно резок?

Это сообщение отредактировал(а) Zloxa - 7.3.2010, 16:06


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
aktuba
Дата 9.3.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Цитата(Akina @  7.3.2010,  12:44 Найти цитируемый пост)
В твоём частном случае это 56 - это произведение количества записей в остальных таблицах, которые соответствуют этой твоей "одной записи".


Думаешь? Есть еще одна запись в таблице tbl_projects. ВСЕ! Итого: одна запись в tbl_advert_stat и одна в tbl_projects. Откуда 56 взялось???



--------------------
user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 9.3.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(aktuba @  9.3.2010,  12:05 Найти цитируемый пост)
одна запись в tbl_advert_stat и одна в tbl_projects

Не верю.
Сделай запрос без группировки и агрегатных функций - сколько получишь записей?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 9.3.2010, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(aktuba @  9.3.2010,  11:05 Найти цитируемый пост)
одна запись в tbl_advert_stat и одна в tbl_projects.

если это действительно так, то ты действительно, наверное, столкнулся  с багом.
Если ты действительно столкнулся с багом, то вопрос "почему так" на этот форум - риторический.
Воркэраунд ты, вроде как уж нашел.
Тему можно бы и закрыть.

Однако ж мне, лично, кажется более вероятным, что ты гдето чтото не так смотришь. Иначе, ты бы смог симптоматику продемонстрировать так, чтобы ни у кого сомнений не возникло.

Добавлено через 7 минут и 55 секунд
Цитата(Akina @  9.3.2010,  11:22 Найти цитируемый пост)
Сделай запрос без группировки и агрегатных функций - сколько получишь записей? 

либо в этот же запрос добавить count(*)


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1082 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.