Jump to content
php.lv forumi

MySQL GROUP BY


AcidRain

Recommended Posts

Es patiešām neticu, ka nav iespējams izmantojot GROUP BY, sagrupējot vairākus ierakstus, tos sagrupēt nevis pēc pirmā sastaptā ieraksta bet gan pēc pēdējā.

 

Piemēram ja man ir tabula ar `Name` un `Text` laukiem un man ie pieņemsim divi ieraksti 'test','kautkaads texts' un 'test','cits teksts'.

Tātad ja es taisīšu vaicājumu SELECT `Name`,`Text` FROM `table` GROUP BY `Name` tas man izdos 'test','kautkaads texts', bet kā lai panāku lai tas man izdod 'test','cits teksts'?

 

Es ceru ka MySQL tomēr ir tāda iespēja, jo negribās taisīt drausmīgākos vaicājumus lai tiktu pie tik vienkāršas lietas.

Var gadīties ka to var ļoti labi panākt ar apakšvaicājumiem, bet pagaidām nevaru iebraukt kāda ir viņu pamatdoma īsti.

Link to comment
Share on other sites

Piemēram ja man ir tabula ar `Name` un `Text` laukiem un man ie pieņemsim divi ieraksti 'test','kautkaads texts' un 'test','cits teksts'.

Tātad ja es taisīšu vaicājumu SELECT `Name`,`Text` FROM `table` GROUP BY `Name` tas man izdos 'test','kautkaads texts', bet kā lai panāku lai tas man izdod 'test','cits teksts'?

A kāda jēga no šī selekta? Parasti jau GROUP BY lieto, lai dabūtu visādas summas, vidējo vērtību, u.c. lietas saistībā ar skaitļiem! Bet ja tu gribi dabūt vienkārši pēdējo ierakstu (pēc alfabēta), kuram Name=' test', tad jau der šāds kverijs:

 SELECT `Name`, `Text` FROM `table` WHERE Name='test' ORDER BY `Text` DESC LIMIT 1

 

P.S. rezervētos vārdus kā Text un table labāk nelieto kolonnu/tabulu nosaukumos, tā kverijus varēs rakstīt bez visādām ` pēdiņām. ;)

Edited by bubu
Link to comment
Share on other sites

Nē, man vajag grupēt pēc `Name`, bet grupēt tā, lai sagrupējot beigās ir nevis pirmais ieraksts, bet gan pēdējais.

Es domāju varbūt ir iespējams kaut kā norādīt, ka MySQL vaicājumu taisa no apakšas uz augšu nevis kā parasti no augšas uz apakšu.

Link to comment
Share on other sites

Redzi, peec relaacijas definiicijas ir taa, ka ieraksti pashi par sevi tabulaa nekaa nav sakaartoti. Tikai ar visaadiem order by Tu vari panaakt sev veelamo rezultaatu. Un group by tieshaam ir izmantojams tikai pie visaadaam agregaatfunkcijaam, tjipa sum, avg, count....

***

Bet, lai panaaktu to, ko Tu gribi, man domaat, bez subselecta/viewa neiztikt (ar kuriem MySQL pagaidaam veel ir taa pashvakaak)

Tjipa tad vareetu pievienot tabulai veel id lauku, kas ir autoincrements. Vispirms noselekteet tabulu, sakaartotu peec id preteejaa virzienaa un tad no taas taisiit Tavu jociigo group by selectu. Aptuveni taa.

Link to comment
Share on other sites

Es tagad jau atradu citu variantu, kas manā gadījumā derēs, bet baigi žēl, ka nevar sakārtot to ko gribi grupēt un ar tām agregātfunkcijām man īsti neizdevās iegūt vajadzīgo rezultātu.

Nācās sadalīt vairākās daļās visu uzdevumu, bet gribējās to visu uzgrūzt tīri uz MySQL, tagad nāksies ar php arī kaut ko padarīt, bet gan jau būs labi :)

Link to comment
Share on other sites

Ugu, mysql tieshaam visu biezhi nevar tik pat skaisti sagruust vienaa selectaa kaa piemeeram kaada oraclee :) visaadi starprezultaati jaapiefixee ieksh php un jaadarbojas ar vairaakiem selectiem :) mysql baigi pietruukst storeetaas funkcijas un proceduuras :)

Link to comment
Share on other sites

Ugu, mysql tieshaam visu biezhi nevar tik pat skaisti sagruust vienaa selectaa kaa piemeeram kaada oraclee smile.gif visaadi starprezultaati jaapiefixee ieksh php un jaadarbojas ar vairaakiem selectiem smile.gif mysql baigi pietruukst storeetaas funkcijas un proceduuras smile.gif

 

bez storētajām jau varētu iztikt. tās tomēr lieto ļoti mazs procents cilvju. bet mySQL, cik saprotu, joprojām nav stable versijas ar SUB-Query atbalstu. :(

Link to comment
Share on other sites

par pašu AcidRain problēmu - ja to nevar atrisināt mySQL līmenī (šoreiz laikam bez sub-query neiztikt), tad vajag atrisināt augstākā līmenī.

 

varbūt problēmu var atrisināt šādi:

:unsure:

 select `name`, `text`
 from `table`
 group by `name`
 order by max(`id`) desc

 

šis gan strādās tikai tādā gadījumā, ja ID tiek piešķirts auto-number, un visu laiku augošā secībā. :P

Link to comment
Share on other sites

Principaa jau group by savu darbinju izdara pirms order by.

Respektiivi tabula kaut kaa ir jaasakaarto ar citu kveriju jau pirms peedeejaa group by izsaukshanas. Vajadziigs subkverijs. (select * from select...)

Link to comment
Share on other sites

Principaa jau group by savu darbinju izdara pirms order by.

Respektiivi tabula kaut kaa ir jaasakaarto ar citu kveriju jau pirms peedeejaa group by izsaukshanas. Vajadziigs subkverijs. (select * from select...)

 

nepiekritīšu Tev, des. KĀRTOT PIRMS GROUP BY nebūs pareizi, jo imho neviena DB nesaka, kādā secībā iedos sagrupētos rezultātus. manuprāt kārtošana jāveic pēc GROUP BY.

Link to comment
Share on other sites

shis gan met aaraaa

"invalid use of group function"

(vismaz uz versijas 4.0.16)

 

nu, te ir kārtējais gadījums, kad mums vajag "apmānīt" mySQL, iekš order lietojot nevis funkciju, bet gan tās alias

 

SELECT count(*), parent_id, max(iest_id) as pedeja_rinda
FROM `iestades`
group by parent_id
order by pedeja_rinda desc

 

tā, lūk :rolleyes:

Link to comment
Share on other sites

×
×
  • Create New...