Solution Discussion Working with Per-Group and Overall Summary Values Simultaneously
7.18.2 Solution
Recognize t hat t his is a variant on working wit h different levels of sum m ary inform at ion, and solve t he problem using t he sam e t echniques.7.18.3 Discussion
Suppose you want t o produce a report t hat looks like t his: Name: Ben; days on road: 3; miles driven: 362 date: 2001-11-29, trip length: 131 date: 2001-11-30, trip length: 152 date: 2001-12-02, trip length: 79 Name: Henry; days on road: 5; miles driven: 911 date: 2001-11-26, trip length: 115 date: 2001-11-27, trip length: 96 date: 2001-11-29, trip length: 300 date: 2001-11-30, trip length: 203 date: 2001-12-01, trip length: 197 Name: Suzi; days on road: 2; miles driven: 893 date: 2001-11-29, trip length: 391 date: 2001-12-02, trip length: 502 The report show s, for each driver in t he driver_log t able, t he following inform at ion: • A sum m ary line showing t he driver nam e, t he num ber of days on t he road, and t he num ber of m iles driven. • A list of t he dat es and m ileages for t he individual t rips from which t he sum m ary values are calculat ed. This scenario is a variat ion on t he different levels of sum m ary inform at ion problem discussed in t he previous recipe. I t m ay not seem like it at first , because one of t he t ypes of inform at ion is a list rat her t han a sum m ary. But t hat s really j ust a level zero sum m ary. This kind of problem appears in m any ot her form s: • You have a dat abase t hat list s cont ribut ions t o candidat es in your polit ical part y. The part y chair request s a print out t hat shows, for each candidat e, t he num ber of cont ribut ions and t ot al am ount cont ribut ed, as well as a list of cont ribut or nam es and addresses. • You want t o m ake a handout for a com pany present at ion t hat sum m arizes t ot al sales per sales region, wit h a list under each region showing t he sales for each st at e in t he region. I n each case, t he solut ions are like t hose discussed in t he previous recipe: • Run separat e queries t o get t he inform at ion for each level of det ail t hat you require. Just as a single query wont produce per-group sum m ary values and an overall sum m ary value at t he sam e t im e, neit her will one query produce per-group sum m ary values and a list of each groups individual records. • Fet ch t he rows t hat m ake up t he list s and perform t he sum m ary calculat ions yourself t o elim inat e t he sum m ary query. Let s use each approach t o produce t he driver report shown at t he beginning of t his sect ion. The following im plem ent at ion in Pyt hon generat es t he report using one query t o sum m arize t he days and m iles per driver, and anot her t o fet ch t he individual t rip records for each driver: select total miles per driver and construct a dictionary that maps each driver name to days on the road and miles driven name_map = { } cursor = conn.cursor cursor.execute SELECT name, COUNTname, SUMmiles FROM driver_log GROUP BY name for name, days, miles in cursor.fetchall : name_map[name] = days, miles select trips for each driver and print the report, displaying the summary entry for each driver prior to the list of trips cursor.execute SELECT name, trav_date, miles FROM driver_log ORDER BY name, trav_date cur_name = for name, trav_date, miles in cursor.fetchall : if cur_name = name: new driver; print drivers summary info print Name: s; days on road: d; miles driven: d \ name, name_map[name][0], name_map[name][1] cur_name = name print date: s, trip length: d trav_date, miles cursor.close By perform ing sum m ary calculat ions in t he program , you can reduce t he num ber of queries required. I f you it erat e t hrough t he t rip list and calculat e t he per-driver day count s and m ileage t ot als yourself, a single query suffices: get list of trips for the drivers cursor = conn.cursor cursor.execute SELECT name, trav_date, miles FROM driver_log ORDER BY name, trav_date rows = cursor.fetchall cursor.close iterate through rows once to construct a dictionary that maps each driver name to days on the road and miles driven the dictionary entries are lists rather than tuples because we need mutable values that can be modified in the loop name_map = { } for name, trav_date, miles in rows: if not name_map.has_key name: initialize entry if nonexistent name_map[name] = [0, 0] name_map[name][0] = name_map[name][0] + 1 count days name_map[name][1] = name_map[name][1] + miles sum miles iterate through rows again to print the report, displaying the summary entry for each driver prior to the list of trips cur_name = for name, trav_date, miles in rows: if cur_name = name: new driver; print drivers summary info print Name: s; days on road: d; miles driven: d \ name, name_map[name][0], name_map[name][1] cur_name = name print date: s, trip length: d trav_date, miles Should you require m ore levels of sum m ary inform at ion, t his t ype of problem get s m ore difficult . For exam ple, you m ight want t he report showing driver sum m aries and t rip logs t o be preceded by a line t hat shows t he t ot al m iles for all drivers: Total miles driven by all drivers combined: 2166 Name: Ben; days on road: 3; miles driven: 362 date: 2001-11-29, trip length: 131 date: 2001-11-30, trip length: 152 date: 2001-12-02, trip length: 79 Name: Henry; days on road: 5; miles driven: 911 date: 2001-11-26, trip length: 115 date: 2001-11-27, trip length: 96 date: 2001-11-29, trip length: 300 date: 2001-11-30, trip length: 203 date: 2001-12-01, trip length: 197 Name: Suzi; days on road: 2; miles driven: 893 date: 2001-11-29, trip length: 391 date: 2001-12-02, trip length: 502 I n t his case, you need eit her anot her query t o produce t he t ot al m ileage, or anot her calculat ion in your program t hat com put es t he overall t ot al.Chapter 8. Modifying Tables with ALTER TABLE
I nt roduct ion Dropping, Adding, or Reposit ioning a Colum n Changing a Colum n Definit ion or Nam e The Effect of ALTER TABLE on Null and Default Value At t ribut es Changing a Colum ns Default Value Changing a Table Type Renam ing a Table Adding or Dropping I ndexes Elim inat ing Duplicat es by Adding an I ndex Using ALTER TABLE t o Norm alize a TableParts
» O'Reilly-MySQL.Cookbook.eBook-iNTENSiTY. 4810KB Mar 29 2010 05:03:43 AM
» Introduction Using the mysql Client Program
» Problem Solution Discussion Setting Up a MySQL User Account
» Problem Solution Discussion Starting and Terminating mysql
» Problem Solution Discussion Specifying Connection Parameters by Using Option Files
» Problem Solution Discussion Mixing Command-Line and Option File Parameters
» Problem Solution Discussion What to Do if mysql Cannot Be Found
» Problem Solution Discussion Setting Environment Variables
» Problem Solution Discussion Repeating and Editing Queries
» Problem Solution Discussion Preventing Query Output from Scrolling off the Screen
» Problem Solution Discussion Specifying Arbitrary Output Column Delimiters
» Problem Solution Discussion Logging Interactive mysql Sessions
» Discussion Using mysql as a Calculator
» Writing Shell Scripts Under Unix
» Writing Shell Scripts Under Windows
» MySQL Client Application Programming Interfaces
» Perl Connecting to the MySQL Server, Selecting a Database, and Disconnecting
» PHP Connecting to the MySQL Server, Selecting a Database, and Disconnecting
» Python Connecting to the MySQL Server, Selecting a Database, and Disconnecting
» Java Connecting to the MySQL Server, Selecting a Database, and Disconnecting
» Problem Solution Discussion Checking for Errors
» Python Java Checking for Errors
» Problem Solution Discussion Writing Library Files
» Python Writing Library Files
» SQL Statement Categories Issuing Queries and Retrieving Results
» Perl Issuing Queries and Retrieving Results
» Python Issuing Queries and Retrieving Results
» Java Issuing Queries and Retrieving Results
» Problem Solution Discussion Moving Around Within a Result Set
» Problem Solution Discussion Using Prepared Statements and Placeholders in Queries
» Perl Using Prepared Statements and Placeholders in Queries
» PHP Python Java Using Prepared Statements and Placeholders in Queries
» Problem Solution Discussion Including Special Characters and NULL Values in Queries
» Perl Including Special Characters and NULL Values in Queries
» PHP Including Special Characters and NULL Values in Queries
» Python Java Including Special Characters and NULL Values in Queries
» PHP Python Java Handling NULL Values in Result Sets
» Problem Solution Discussion Writing an Object-Oriented MySQL Interface for PHP
» Class Overview Writing an Object-Oriented MySQL Interface for PHP
» Connecting and Disconnecting Writing an Object-Oriented MySQL Interface for PHP
» Error Handling Issuing Queries and Processing the Results
» Quoting and Placeholder Support
» Problem Solution Discussion Ways of Obtaining Connection Parameters
» Getting Parameters from the Command Line
» Getting Parameters from Option Files
» Conclusion and Words of Advice
» Problem Solution Discussion Avoiding Output Column Order Problems When Writing Programs
» Problem Solution Discussion Using Column Aliases to Make Programs Easier to Write
» Problem Solution Discussion Selecting a Result Set into an Existing Table
» Problem Solution Discussion Creating a Destination Table on the Fly from a Result Set
» Problem Solution Discussion Moving Records Between Tables Safely
» Problem Solution Discussion Cloning a Table Exactly
» Problem Solution Discussion Generating Unique Table Names
» Problem Solution Discussion Using TIMESTAMP Values
» Problem Solution Discussion Using ORDER BY to Sort Query Results
» Solution Discussion Working with Per-Group and Overall Summary Values Simultaneously
» Problem Solution Discussion Changing a Column Definition or Name
» Problem Solution Discussion Changing a Table Type
» Problem Solution Discussion Adding Indexes
» Introduction Obtaining and Using Metadata
» Problem Solution Discussion Perl PHP
» Problem Solution Discussion Perl
» PHP Obtaining Result Set Metadata
» Python Obtaining Result Set Metadata
» Java Obtaining Result Set Metadata
» Using Result Set Metadata to Get Table Structure
» Problem Solution Discussion Database-Independent Methods of Obtaining Table Information
» Problem Solution Discussion Displaying Column Lists Interactive Record Editing
» Mapping Column Types onto Web Page Elements Adding Elements to ENUM or SET Column Definitions
» Selecting All Except Certain Columns
» Problem Solution Discussion Listing Tables and Databases
» Problem Solution Writing Applications That Adapt to the MySQL Server Version
» Discussion Writing Applications That Adapt to the MySQL Server Version
» Problem Solution Discussion Determining Which Table Types the Server Supports
» General Import and Export Issues
» Problem Solution Discussion Importing Data with LOAD DATA and mysqlimport
» Problem Solution Discussion Specifying the Datafile Location
» Problem Solution Discussion Specifying the Datafile Format
» Problem Solution Discussion Dealing with Quotes and Special Characters
» Problem Solution Discussion Handling Duplicate Index Values
» Problem Solution Discussion Getting LOAD DATA to Cough Up More Information
» Problem Solution Discussion Dont Assume LOAD DATA Knows More than It Does
» Problem Solution Discussion Skipping Datafile Columns
» Problem Solution Discussion Exporting Query Results from MySQL
» Using the mysql Client to Export Data
» Problem Solution Discussion Exporting Tables as Raw Data
» Problem Solution Discussion Exporting Table Contents or Definitions in SQL Format
» Problem Solution Discussion Copying Tables or Databases to Another Server
» Problem Solution Discussion Writing Your Own Export Programs
» Problem Solution Discussion Converting Datafiles from One Format to Another
» Problem Solution Discussion Extracting and Rearranging Datafile Columns
» Problem Solution Discussion Validating and Transforming Data
» Writing an Input-Processing Loop Putting Common Tests in Libraries
» Problem Solution Discussion Validation by Pattern Matching
» Problem Solution Discussion Using Patterns to Match Numeric Values
» Problem Solution Discussion Using Patterns to Match Dates or Times
» See Also Using Patterns to Match Dates or Times
» Problem Solution Discussion Using Patterns to Match Email Addresses and URLs
» Problem Solution Discussion Validation Using Table Metadata
» Problem Solution Discussion Issue Individual Queries Construct a Hash from the Entire Lookup Table
» Use a Hash as a Cache of Already-Seen Lookup Values
» Problem Solution Discussion Converting Two-Digit Year Values to Four-Digit Form
» Problem Solution Discussion Performing Validity Checking on Date or Time Subparts
» Problem Solution Discussion Writing Date-Processing Utilities
» Problem Solution Discussion Performing Date Conversion Using SQL
» Problem Solution Discussion Guessing Table Structure from a Datafile
» Problem Solution Discussion A LOAD DATA Diagnostic Utility
» Problem Solution Discussion Exchanging Data Between MySQL and Microsoft Access
» Problem Solution Discussion Exchanging Data Between MySQL and Microsoft Excel
» Problem Solution Discussion Exchanging Data Between MySQL and FileMaker Pro
» Problem Solution Discussion Importing XML into MySQL
» Epilog Importing and Exporting Data
» Introduction Generating and Using Sequences
» Problem Solution Discussion Using AUTO_INCREMENT To Set Up a Sequence Column
» Problem Solution Discussion Choosing the Type for a Sequence Column
» Problem Solution Discussion Ensuring That Rows Are Renumbered in a Particular Order
» Problem Solution Discussion Managing Multiple Simultaneous AUTO_INCREMENT Values
» Problem Solution Discussion Using AUTO_INCREMENT Values to Relate Tables
» Problem Solution Discussion Generating Repeating Sequences
» Problem Solution Discussion See Also
» Performing a Related-Table Update Using Table Replacement
» Performing a Related-Table Update by Writing a Program
» Performing a Multiple-Table Delete by Writing a Program
» Problem Solution Discussion Dealing with Duplicates at Record-Creation Time
» Problem Solution Discussion Using Transactions in Perl Programs
» Problem Solution Discussion Using Transactions in Java Programs
» Problem Solution Discussion Using Alternatives to Transactions
» Grouping Statements Using Locks
» Rewriting Queries to Avoid Transactions
» Introduction Introduction to MySQL on the Web
» Problem Solution Discussion Basic Web Page Generation
» Problem Solution Discussion Using Apache to Run Web Scripts
» Problem Solution Discussion Using Tomcat to Run Web Scripts
» Installing the mcb Application
» Installing the JSTL Distribution
» Problem Solution Discussion Encoding Special Characters in Web Output
» General Encoding Principles Encoding Special Characters in Web Output
» Encoding Special Characters Using Web APIs
» Introduction Incorporating Query Results into Web Pages
» Problem Solution Discussion Creating a Navigation Index from Database Content
» Creating a Multiple-Page Navigation Index
» Problem Solution Discussion Storing Images or Other Binary Data
» Storing Images with LOAD_FILE Storing Images Using a Script
» Problem Solution Discussion Retrieving Images or Other Binary Data
» Problem Solution Discussion Serving Banner Ads
» Problem Solution Discussion Serving Query Results for Download
» Introduction Processing Web Input with MySQL
» Problem Solution Discussion Creating Forms in Scripts
» Problem Solution Discussion Creating Multiple-Pick Form Elements from Database Content
» Problem Solution Discussion Loading a Database Record into a Form
» Problem Solution Discussion Collecting Web Input
» Web Input Extraction Conventions Perl
» Problem Solution Discussion Validating Web Input
» Problem Solution Discussion Using Web Input to Construct Queries
» Problem Solution Discussion Processing File Uploads
» Perl Processing File Uploads
» Problem Solution Discussion Performing Searches and Presenting the Results
» Problem Solution Discussion Generating Previous-Page and Next-Page Links
» Paged Displays with Previous-Page and Next-Page Links
» Paged Displays with Links to Each Page
» Problem Solution Discussion Web Page Access Counting
» Problem Solution Discussion Web Page Access Logging
» Problem Solution Discussion Setting Up Database Logging
» Other Logging Issues Using MySQL for Apache Logging
» Session Management Issues Introduction
» Problem Solution Discussion Installing Apache::Session
» The Apache::Session Interface
» A Sample Application Using MySQL-Based Sessions in Perl Applications
» Problem Solution Discussion The PHP 4 Session Management Interface
» Specifying a User-Defined Storage Module
» Problem Solution Discussion Using MySQL for Session BackingStore with Tomcat
» The Servlet and JSP Session Interface A Sample JSP Session Application
Show more