Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Помогите сделать хитрый запрос: сумма заказов по месяцам и типам

Сообщения:  [1-10]   [11-19] 

 
 автор: Trianon   (15.01.2011 в 17:33)   письмо автору
 
   для: tAleks   (15.01.2011 в 17:27)
 

Ограничение по длине JOIN-цепочки - минимум 32, и сейчас по-моему 64.
Если в него не влезть, или запрос становится слишком тяжелым,
то выдаются отдельные запросы на каждый месяц.
Они и строятся проще и обрабатываются быстрее.

  Ответить  
 
 автор: tAleks   (15.01.2011 в 17:27)   письмо автору
 
   для: cheops   (15.01.2011 в 16:48)
 

Всем спасибо за все ответы и помощь.

Еще вот такой вопрос.

Если типов будет не 2, а к примеру 10 или 20, и нужно будет выдать широкую таблицу со всеми 10 или 20 колонками, такой способ ведь уже не подойдет. Как в таком случае можно будет реализовать задуманное?

  Ответить  
 
 автор: cheops   (15.01.2011 в 16:48)   письмо автору
 
   для: tAleks   (15.01.2011 в 16:33)
 

В данном случае, вероятно привести нельзя, так как изначально все вертится вокруг дат, которые жестко диктуются первой таблицей и через которые связаны все генерируемые таблицы. А вот если бы в одном из случаев условие USING() или ON() вообще не использовались бы, тогда бы в результирующую таблицу вывалилось бы полное декартово произведение. Чтобы исключить дублирующие строки пришлось бы использовать GROUP BY.

  Ответить  
 
 автор: Trianon   (15.01.2011 в 16:45)   письмо автору
 
   для: tAleks   (15.01.2011 в 12:14)
 

Лишний, конечно.
скопипастил, не посмотрев.

  Ответить  
 
 автор: tAleks   (15.01.2011 в 16:33)   письмо автору
 
   для: cheops   (15.01.2011 в 12:40)
 

Например?
Приведите пожалуйста пример, когда в данном случае без GROUP BY было бы не обойтись.

Спасибо.

  Ответить  
 
 автор: cheops   (15.01.2011 в 12:40)   письмо автору
 
   для: tAleks   (15.01.2011 в 12:14)
 

Для подстраховки, да, здесь можно обойтись. Но если бы в условии USING() было другое условие, то без GROUP BY было бы не обойтись.

  Ответить  
 
 автор: tAleks   (15.01.2011 в 12:22)   письмо автору
 
   для: cheops   (14.01.2011 в 23:52)
 

Понял. Спасибо!

Еще вопрос. Если типов будет не 2, а к примеру 10 или 20, и нужно будет выдать широкую таблицу со всеми 10 или 20 колонками, такой способ ведь уже не подойдет. Как в таком случае можно будет реализовать задуманное?

  Ответить  
 
 автор: tAleks   (15.01.2011 в 12:14)   письмо автору
 
   для: Trianon   (14.01.2011 в 23:47)
 

А зачем в результирующей таблице "GROUP BY m.date"? Без него можно обойтись?

  Ответить  
 
 автор: cheops   (14.01.2011 в 23:52)   письмо автору
 
   для: tAleks   (14.01.2011 в 23:32)
 

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

  Ответить  
 
 автор: Trianon   (14.01.2011 в 23:47)   письмо автору
 
   для: cheops   (14.01.2011 в 23:18)
 

SELECT  
                m.date,  
                personal.volume AS p_volume,  
                organization.volume AS o_volume  
            FROM  
             ( 
                 SELECT DISTINCT DATE_FORMAT(date_order, '%Y-%m') AS date 
                 FROM users_orders  
                 WHERE id_user = 1134 
             )  AS m
             LEFT JOIN (  
                SELECT   
                    DATE_FORMAT(date_order, '%Y-%m') AS date,   
                    SUM(volume) AS volume  
                FROM users_orders  
                WHERE id_user = 1134 
                    AND type = 'personal'  
                GROUP BY date  
                ) AS personal ON m.date = personal.date
            LEFT JOIN (  
                SELECT   
                    DATE_FORMAT(date_order, '%Y-%m') AS date,   
                    SUM(volume) AS volume  
                FROM users_orders  
                WHERE id_user = 1134  
                    AND type = 'organization'  
                GROUP BY date  
                ) AS organization ON m.date = organization.date
            GROUP BY m.date
            ORDER BY m.date


Так наверное будет лучше.
USING - материя достаточно тонкая.

  Ответить  

Сообщения:  [1-10]   [11-19] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования