Jump to content
php.lv forumi

Dubultojas izvadītie raksti ar INNER JOIN


Recommended Posts

Posted

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.

 

  • Replies 39
  • Created
  • Last Reply

Top Posters In This Topic

Posted

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.

Posted

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.

Posted
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.

Posted (edited)

@iall - kāpēc tu tajā kverijā semikolu iebāzi?

Also, `ORDER BY ziedu_kategorijas.nosaukums ASC`, nevis `ziedi.ziedu.id`.

Edited by jurchiks
Posted

@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ā! :)

Posted

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.

Posted

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.

Posted (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 by jurchiks
Posted

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.

Posted

@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

Posted

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.

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...