| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | MySQL query optimering Fra : Morten | 
  Dato :  20-10-07 19:55 |  
  |   
            
 Hej. Jeg har en MySQL query som jeg tror kan gøres bedre. Min data model:
 
 CREATE TABLE man (id INTEGER, name VARCHAR(64));
 CREATE TABLE car (id INTEGER, owner_id INTEGER, make VARCHAR(64));
 
 En mand kan altså have flere biler. Jeg vil nu gerne udtrække alle 
 bilmærker for en enkelt mand i en enkelt record, så givet flg. data:
 
 INSERT INTO man VALUES (1, 'John');
 INSERT INTO car VALUES (1, 1, 'Mazda');
 INSERT INTO car VALUES (2, 1, 'Ford');
 INSERT INTO car VALUES (3, 1, 'Toyota');
 
 Skal resultatet være "John", "Mazda, Ford, Toyota". Det kan jeg gøre 
 således:
 
 SELECT man.name, virtual_cars.makes
 FROM   man, (SELECT owner_id, GROUP_CONCAT(car.make) AS makes
               FROM car GROUP BY owner_id) AS virtual_cars
 WHERE  man.id = virtual_cars.owner_id
 
 Mit spørgsmål er nu, kan det gøres bedre? Fex. hvis man kunne angive 
 man.id allerede i det virtuelle view "virtual_cars", så er det vel 
 bedre? Eller kan query optimizeren godt regne den ud?
 
 Morten
 
  
            
             |   |   
            
        
 
            
         
           Michael Zedeler (21-10-2007) 
         
	
            | Kommentar Fra : Michael Zedeler | 
  Dato :  21-10-07 10:31 |  
  |   
            Morten wrote:
 > 
 > Hej. Jeg har en MySQL query som jeg tror kan gøres bedre. Min data model:
 > 
 > CREATE TABLE man (id INTEGER, name VARCHAR(64));
 > CREATE TABLE car (id INTEGER, owner_id INTEGER, make VARCHAR(64));
 > 
 > En mand kan altså have flere biler. Jeg vil nu gerne udtrække alle 
 > bilmærker for en enkelt mand i en enkelt record, så givet flg. data:
 > 
 > INSERT INTO man VALUES (1, 'John');
 > INSERT INTO car VALUES (1, 1, 'Mazda');
 > INSERT INTO car VALUES (2, 1, 'Ford');
 > INSERT INTO car VALUES (3, 1, 'Toyota');
 > 
 > Skal resultatet være "John", "Mazda, Ford, Toyota". Det kan jeg gøre 
 > således:
 > 
 > SELECT man.name, virtual_cars.makes
 > FROM   man, (SELECT owner_id, GROUP_CONCAT(car.make) AS makes
 >              FROM car GROUP BY owner_id) AS virtual_cars
 > WHERE  man.id = virtual_cars.owner_id
 > 
 > Mit spørgsmål er nu, kan det gøres bedre? Fex. hvis man kunne angive 
 > man.id allerede i det virtuelle view "virtual_cars", så er det vel 
 > bedre? Eller kan query optimizeren godt regne den ud?
 
 Måske
 
    SELECT owner_id, name, GROUP_CONCAT(make)
      FROM man, car
     WHERE man.id = car.owner_id
 GROUP BY owner_id, name
 
 Mvh. Michael.
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |