iall Posted March 1, 2016 Report Share Posted March 1, 2016 Labdien. Ir divas tabulas, kuras ir sasaistītas kopā ar INNER JOIN, bet problēma ir tāda, ka kategorijas tiek izvadītas dubultā: Flokši Skarainais floksis Phlox paniculata 'Bright Eyes' Rozes wewe Flokši Mazutas bacutas Vēlamais rezultāts būtu šāds: Flokši Skarainais floksis Phlox paniculata 'Bright Eyes' Mazutas bacutas Rozes wewe MySql kvērijs: SELECT * FROM ziedi INNER JOIN ziedu_kategorijas ON ziedi.ziedu_id = ziedu_kategorijas.zid Cik papētīju, tad labākais variants laikam būtu ar GROUP_CONCAT() vai ORDER BY, bet nesanāk. Lauzu galvu jau no vakardienas. Risinājums ir iespējams vienkāršāks par vienkāršu. Paldies. Quote Link to comment Share on other sites More sharing options...
briedis Posted March 1, 2016 Report Share Posted March 1, 2016 lieto DISTINCT Quote Link to comment Share on other sites More sharing options...
iall Posted March 1, 2016 Author Report Share Posted March 1, 2016 Mēģināju šādi: SELECT DISTINCT ziedi.ziedu_id,ziedi.puku_nosaukums,ziedu_kategorijas.zid,ziedu_kategorijas.nosaukums FROM ziedi INNER JOIN ziedu_kategorijas ON ziedi.ziedu_id = ziedu_kategorijas.zid nesanāk. Quote Link to comment Share on other sites More sharing options...
Kavacky Posted March 1, 2016 Report Share Posted March 1, 2016 Tu velc ārā ziedu rindas un katrai rindai piekārto klāt ierakstu no kategoriju rindas. Tev nekas tur neatkārtojas. Tā ir viena rinda vienam ziedam ar papildus datiem. Viss ir pareizi. Ja tu gribi izvadīt ziedus zem kateogrijām koka (pun unintended, haha) veidā, tad liec klāt "ORDER BY ziedi.ziedu_id ASC" un drukā zem augšējā līmeņa, kamēr nepamainās kategorijas nosaukums. Vai arī izvelc vienā kverijā visas kategorijas un otrā - visus ziedus ar kategoriju id'iem, un drukā ciklā cauri kategorijas, tai piedrukājot klāt atbilstošos ziedus. PS: Neraksti "INNER JOIN", bet vienkārši "JOIN", jo tas ir tas pats. Quote Link to comment Share on other sites More sharing options...
iall Posted March 1, 2016 Author Report Share Posted March 1, 2016 SELECT ziedi.ziedu_id,ziedi.puku_nosaukums,ziedu_kategorijas.zid,ziedu_kategorijas.nosaukums FROM ziedi INNER JOIN ziedu_kategorijas ON ziedi.ziedu_id = ziedu_kategorijas.zid; ORDER BY ziedi.ziedu_id ASC Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given Kvērijs atgriež false. Breinfaks kārtējais. @Kavacky - Vilkšu vienā kvērijā visas kategorijas un otrā ziedus ar kategoriju id'iem. Laikam būs vieglāk. Quote Link to comment Share on other sites More sharing options...
jurchiks Posted March 1, 2016 Report Share Posted March 1, 2016 (edited) @iall - kāpēc tu tajā kverijā semikolu iebāzi? Also, `ORDER BY ziedu_kategorijas.nosaukums ASC`, nevis `ziedi.ziedu.id`. Edited March 1, 2016 by jurchiks Quote Link to comment Share on other sites More sharing options...
iall Posted March 1, 2016 Author Report Share Posted March 1, 2016 @jurchiks - Nemaz nepamanīju, paldies. SELECT ziedi.ziedu_id,ziedi.puku_nosaukums,ziedu_kategorijas.zid,ziedu_kategorijas.nosaukums FROM ziedi INNER JOIN ziedu_kategorijas ON ziedi.ziedu_id = ziedu_kategorijas.zid ORDER BY ziedu_kategorijas.nosaukums ASC Tagad izvelk šādi: Flokši Mazutas bacutas Flokši Skarainais floksis Phlox paniculata 'Bright Eyes' Rozes wewe Tuvāk patiesībai ir, floksis palīda uz augšu, bet dubultojās maita tik un tā! :) Quote Link to comment Share on other sites More sharing options...
Kavacky Posted March 1, 2016 Report Share Posted March 1, 2016 Tev nevis kverijs ir nepareizs, bet izvadīšanas princips. Tev nekas nedubultojas, tev ir PRECĪZI VIENA RINDA KATRAM ZIEDAM. Tajā vienā rindā katram ziedam ir klāt precīzi viena kategorija. Kāpēc? Jo tu kverijā velc ārā visus ziedus, kam piekārto klāt kaut kādu papildinformāciju, šajā gadījumā - kategorijas. Doma, ka vienā kverijā tev varētu būt dažādu tipu rindas ar pilnīgi dažādu informāciju, pašos pamatos ir absolūti nepareiza. Quote Link to comment Share on other sites More sharing options...
iall Posted March 1, 2016 Author Report Share Posted March 1, 2016 Tad sanāk, ka izvadot man ir jāpārbauda vai tāda kategorija jau ir un ja ir, tad neizvadīt otru reizi. Pareizi sapratu? Ar MySql ir iespējams izvadītās kategorijas sagrupēt, lai man nebūtu ar PHP jāķēpājas? Migla galvā, jāiet pastaigāt, smuks laiks. Quote Link to comment Share on other sites More sharing options...
jurchiks Posted March 1, 2016 Report Share Posted March 1, 2016 (edited) Nevar tā sagrupēt, kā tu iedomājies, tad nav konsistenti dati. Var darīt tā, ka papriekš kverijo ziedu kategorijas, un tad ciklē tām cauri un pēc kategorijas ID atlasa ziedus, un tev tieši tas ir vajadzīgs. $categories = SELECT zid, nosaukums FROM ziedu_kategorijas ORDER BY nosaukums ASC $flowers = []; foreach ($categories as $category) { $flowers[$category['zid']] = SELECT puku_nosaukums FROM ziedi WHERE ziedu_id = ? ORDER BY puku_nosaukums ASC, $category['zid'] // prepared statement, OBLIGĀTI (http://php.net/manual/en/mysqli.prepare.php) } // alternatīvi, ekonomējot SQL pieprasījumus: $tmp = SELECT zid, puku_nosaukums FROM ziedi ORDER BY puku_nosaukums ASC $flowers = []; foreach ($tmp as $flower) { $flowers[$flower['zid']][] = $flower['nosaukums']; } // izvade: foreach ($categories as $category) { echo $category['nosaukums']; // pastāv varbūtība, ka kādā kategorijā nav ziedu un tad $flowers[$category['zid']] nebūs masīvs un šeit tiks izmests warning; domāju, ar to mācēsi tikt galā foreach ($flowers[$category['zid']] as $flower) { echo $flower['puku_nosaukums']; } } Edited March 1, 2016 by jurchiks Quote Link to comment Share on other sites More sharing options...
Kavacky Posted March 1, 2016 Report Share Posted March 1, 2016 SQL selekts NAV veids, kā datus IZVADĪT. SQL selekts ir veids, kā datus IEGŪT. Ko tu pēc tam un kā ar viņiem dari, nav SQL daļa. Un nē, tu negribi (pat nevari) maisīt dažādus datus SQL pusē, tu gribi to darīt PHP pusē. Lai vienkāršāk, tu vari "ORDER BY zieda_kategorija ASC, zieda_nosaukums ASC". Tad viss pareizi ies pēc kārtas, tev tikai pašam ar PHP jākonstatē, kur pamainās kategorija. Quote Link to comment Share on other sites More sharing options...
iall Posted March 1, 2016 Author Report Share Posted March 1, 2016 @jurchiks - liels paldies, tūlīt pat ķeršos klāt. Ziņošu kā izdevās. @Kavacky - vai, vai, vai, kāds šodien pūcējās! :D Quote Link to comment Share on other sites More sharing options...
Kavacky Posted March 1, 2016 Report Share Posted March 1, 2016 Es šodien nepūcējos, man zb atkārtoties vairāk par 0x ir jebkurā dienā. ;) Quote Link to comment Share on other sites More sharing options...
iall Posted March 1, 2016 Author Report Share Posted March 1, 2016 Labvakar. Esmu uzsēdies uz šo: $categories = $conn->query("SELECT zid, nosaukums FROM ziedu_kategorijas ORDER BY nosaukums ASC"); $flowers = []; foreach ($categories as $category) { $flowers[$category['zid']] = "SELECT puku_nosaukums FROM ziedi WHERE ziedu_id = ? ORDER BY puku_nosaukums ASC, $category[zid]"; } Nevaru, vai drīzāk nemāku, sabindot lai aizstāj "?" zīmi. Met šo - "Fatal error: Call to undefined method mysqli_stmt::bind_results()" Paldies visiem, kas velta savu laiku, man palīdzēt atrisināt šo problēmu. Quote Link to comment Share on other sites More sharing options...
Kasspars Posted March 1, 2016 Report Share Posted March 1, 2016 Neviena no tevis uzrakstītajām ridiņām nevar mest šo kļūdu! "Fatal error: Call to undefined method mysqli_stmt::bind_results()" Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.