Jump to content
php.lv forumi

Problēma ar JOIN veidošanu


Roboc

Recommended Posts

Sveiki! Ir neliela problēma ar selekta veidošanu. Tā kā pieredze ar joinu veidošanu ir maza, tad nočakarējos ar to pus dienu, bet rezultāts nav īsti tāds kā gribētos.

 

 

Situācija šāda:

 

Ir 2 tabulas,

pirmā, kas satur datus par automašīnām (ražotājs, modelis, gads, u.t.t.), aptuveni 50 000 ieraksti.

Otrā, kas satur tikai markas (Audi, Chrysler, Dodge, u.t.t.), 250 ieraksti.

 

 

 

tabulas "cars" lauki:

| ID | make | model | year | utt

----------------------------

1 | Dodge | Caravan | 1997 |

2 | Toyota | Corolla | 2003|

3 | Audi | A6 | 2003 |

4 | Audi | R8 | 2008 |

.............

 

 

tabulas "makes" lauki:

| MakeID | MakeName | MakeType | utt

----------------------------

1 | Audi | Passanger |

2 | Dodge | Passanger |

3 | Buick | Passanger |

.............

 

Ideja ir izvadīt pilnu sarakstu ar ražotājiem no tabulas "makes", kur katrai rindiņai pretīm būtu saskaitīts, cik ieraksti attiecīgajam ražotājam ir tabulā "cars".

Apmēram šādi:

Audi - 2

Dodge - 1

Buick - 0

Toyota - 1

 

 

Uzmeistaroju šādu selektu:

$sql = "SELECT makes.MakeName, count(cars.make) AS makeCount
					FROM cars 
					JOIN makes 
					ON makes.MakeName = cars.make
					GROUP BY cars.make
					ORDER BY makes.MakeName"; 

bet ir vairākas problēmas:

1. ražotāju saraksts tiek veidots no "cars" tabulas, bet vajag no "makes" tabulas

2. netiek atgriesti ieraksti, kuriem skaits ir 0

3. pieprasījums notiek baigi lēnu ~10 sec. Visticamāk visu bremzē GROUP BY, bet bez ta nemācēju uztaisīt.. :(

 

Varbūt kāds var palīdzēt šajā jautājumā?!

Link to comment
Share on other sites

1. Ražotāju nosaukums tiek veidots no makes tabulas, jo Tu taču izmanto makes.MakeName, nevis cars.make, kā attēlojamo lauku

1'. Tabulā cars vajadzēja glabāt make_id = foreign key cars.makeID

2. Jāizmanto LEFT JOIN

3. Jāizpēta, kas tieši bremzē pieprasījumu pieslēdzoties DB un izpildot pieprasījumu ar EXPLAIN pirms tā. Bet parasti tas notiek tādēļ, ka nav izveidoti pareizie indeksi.

 

Vaicājumam būtu jābūt ~ šādam:

SELECT makes.MakeName, count(cars.make) AS makeCount
FROM cars
LEFT JOIN makes 
  ON cars.make = makes.MakeName
GROUP BY makes.MakeName
ORDER BY makes.MakeName

vai ņemot vērā 1'. punktu

SELECT makes.MakeName, count(cars.ID) AS makeCount
FROM cars
LEFT JOIN makes 
  ON cars.make_id = makes.makeID
GROUP BY makes.MakeName
ORDER BY makes.MakeName

Link to comment
Share on other sites

Paldies par atbildi, bet iisti galarezultaats nav tas ko vajag, jo automshiinu saraksts tiek veidots no CARS tabulas nevis MAKES, kaa buutu vajadziigs.

 

Un CARS tabulaas diemzjeel nevar seivot ierakstus ar MAKES_ID, jo tabulaa dati tiek ieguuti no 3 dazjaadiem resursiem, kur katram ir savs pieraksts, kaa rezultaataa ir baigi gruuti nokontroleet, lai visur markas un modelji ir vienaadi

 

Beigaas uztaisiiju skriptu, kas izpildaas katru stundu, un ar PHP paliidziibu katrai markai updeido skaitu datubaazee - domaaju ka taa buus vienkaarshaak, un serverim buus mazaaka slodze, nebuus uz katra lietotaaja pieprasiijumu jaapaarskaita visas automashiinas.

 

Veelreiz liels paldies, Aleksej, par palliidziibu! ;)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...