Jump to content
php.lv forumi

Sludinājuma portāla datubāzes selekti


test2

Recommended Posts

Tātad mana db izstās šādi:

 

cat

|id|name|icon|

 

sub_cat

|id|cat_id|name|

 

sub_cat2

|id|sub_cat_id|name|

 

sub_cat3

|id|sub_cat2_id|name|

 

advertisment

|id|cat|sub_cat|sub_cat2|sub_cat3|txt|time|

 

Šis, manuprāt, ir visērtāk operējamais koks, vismaz es tā domāju, bet problēma, tur, ka nēesmu īsti liels speciālsists selektu veidošanā, tāpēc gribēju palūgt vai kāds navarētu padalīties ar kodu?

 

Piemēram, ja lapā tiek padots ?cat , izvada visas CAT un apakšā katram CAT - SUB_CAT, bet ja piemēram pieprasa ?cat=1&sub_cat=3 , tad ja eksistē šim te sub_cat - sub_cat2 tad izvelkam arī sub_cat2 saturu, ja nē izvadam sludinājumu listu, jo, piemēram, sadaļas var būt tā:

Transports - > Mašīna -> BMW - > 5 litri (kur tiek izmantotas visas sadaļas

Bet var būt arī tā

Transports -> Citi -> kur tiek pieprasīts tikkai divas sadaļas.

 

Cerams, ka izsteicos skaidri, lūdzu esiet atsaucīgi un pēc iespējas ātrāk, būšu ļoti ļoti pateicīgs!

Link to comment
Share on other sites

  • Replies 34
  • Created
  • Last Reply

Top Posters In This Topic

Vajag taisīt vienā tabulā, tad

1)viss ir vienkāršāk

2)var būt neierobežoti dziļa struktūra

3)sludinājumam ir vienkārši viens cat_id, kurš norāda, kurā kateogorijā sludinājums ielikts.

 

id|pid|name|icon|depth

 

id - kategorijas id

pid- parent kategorijas id

name,icon - dati

depth - dziļums, lai tu zinātu cik kategorija dziļi

 

Un tad elementārs kverijs.

rootam cat.pid norāda 0:

SELECT * FROM cat LEFT JOIN cat as cat2 ON cat2.pid=cat.id  WHERE cat.pid=0;

 

Kādai kategorijai cat.pid norāda tās kategorijas id

SELECT * FROM cat LEFT JOIN cat as cat2 ON cat2.pid=cat.id  WHERE cat.pid=1;

Link to comment
Share on other sites

Nu varbūt es īsti nesapratu tavu variantu codez, bet kā pie velna tu taisies vienā tabulā es vnk nespēju saprast, piemēram ja tev ir CAT mašīna un viņai apakšcat MARKA, un MARKAI apakšcat KRAASA, kaa tu to visu vari vienā tabulā, lūdzu nevar kkādu sīkāku piemēru, ar tam daudzajām padziļinātajām sadaļām?

 

UN tas bubu variants vsp nederēs, kā tu vari bez joiniem kko dabūt ārā?

Tur jau tā lieta es māku izselektēt kkādas db saturu, bet ja piemēram man vajag izselektēt db saturu plus šim te saturam konkurētajam ID atrast no citas tabulas datus, es nez es laikam nemāku paskaidrot :(

 

AA un vel viena lieta, ko es īsti nesaprotu, pieņemsim, man ir šāds selekts:

$query = "SELECT cat.id, cat.name, sub_cat.id, sub_cat.name ".
"FROM cat LEFT JOIN sub_cat ".
"ON cat.id = sub_cat.cat_id";

Tad, kā es varu izvadīt CAT tabulas name kā virsrakstu un apakšā nolistot visus atrastos SUB_CAT names, un tā katram CAT?

Edited by test2
Link to comment
Share on other sites

tabula cat:

id|pid|name

 

1 0 Auto

2 0 Nekustamie Ipasumi

3 1 Opel

4 1 Audi

5 1 Volvo

6 3 Omega

7 3 Astra

8 4 A4

9 4 A6

 

pid tev norāda, kurā kategoijā ietilpst dotā kategorija.

Lai piemēram dabūtu visas markas zem auto, taisi

SELECT * FROM cat WHERE pid=1

Lai dabūtu visas markas un modeļus, taisi:

SELECT * FROM cat LEFT JOIN cat as cat2 ON cat2.pid=cat.id WHERE cat.pid=1;

Link to comment
Share on other sites

Tavā gadījumā rootam būs kaut kas tāds:

SELECT * FROM cat LEFT JOIN sub_cat ON sub_cat.cat_id=cat.id;

 

Attiecīgi dziļāk, zem cat kategorijas, piemēram, 7, būs:

SELECT * FROM sub_cat LEFT JOIN sub_cat2 ON sub_cat2.sub_cat_id=sub_cat.id WHERE sub_cat.cat_id=7;

Edited by codez
Link to comment
Share on other sites

Tavs variants īstenībā ir baigi labais, tikkai es te mocos vislaik ar vienu lietu, piemēram ja es izvelku visu to kopēju listu sajoinoju cat ar sub_cat, kā es varu uztaisīt tā lai to CAT name izvada vienu reizi un tad tos sub_cat datus tik cik viņi ir, respektīvi ja es to visu joinu ielieku ciklā un izvadu man tas cat arī atkārtojas līdz ar katru sub_cat name, kā izdarīt lai neatkārtojas?

Link to comment
Share on other sites

Sakārto pēc cat.name un tad ciklā, kad izvadi, piešķir pagaidu mainīgajam, ja nākamais sakrīt ar pagaidu mainīgo, tad neizvadi, ja nesakrīt, tad izvadi un nomaini pagaidu mainīgo.

while (...){

 if ($tmp!=$row['catname']){
$tmp=$row['catname'];
echo $tmp;
 }

}

Link to comment
Share on other sites

Atvainojos par double post, bet, man veljopojām neizvadas, kā vajag ( ja noņem GROUP BY, tad izvadas viss, taču nname nezkāpēc atkārtojas līdz ar kname) , varbūt esmu kko aizmirsis?:

<?php
$query = "SELECT cat.id, cat.name as nname, sub_cat.id, sub_cat.name as kname FROM cat LEFT JOIN sub_cat ON sub_cat.cat_id=cat.id GROUP BY cat.name";
$result = mysql_query($query) or die(mysql_error());
while($row=mysql_fetch_assoc($result)){
if ($tmp!=$row['nname']){
$tmp=$row['nname'];
}
echo "<h1>".$tmp."</h1><br />\n";
echo $row['kname']."<br />\n";
}
?>

Edited by test2
Link to comment
Share on other sites

UN tas bubu variants vsp nederēs, kā tu vari bez joiniem kko dabūt ārā?

Nu tu jau īsti nepateici, kas tev ir vajadzīgs. Es sapratu, ka tu gribi sludinājumu sarakstu izvilkt no norādītajām kategorijām/apakškategorijām ārā.

Kategoriju izvilkšanai, protams, ka atliek tik papildus JOIN'u pielikt klāt.

 

Tavā pēdējā postā GROUP BY gan nevajag lietot. Tas tev izvadīs tikai vienu ierakstu no katras kategorijas, nevis visus. Es ceru, ka tu saproti, ko tas dara, nevis uz dullo kodā kautko mēģini?

Lai nu kā, vai tev dati pareizi salikti tabulā, ja jau saki, ka nesagaidi to ko gribi, lai izvadās? Kas precīzi tev izvadās nepareizi? Lai tas if's strādātu kā gribi, tad tiem nname jānāk sakārtotā kārtībā selekta rezultātā - tb pieliec klāt sakārtošanu kverijam pēc nname vērtībām.

Link to comment
Share on other sites

jā, taisi ORDER BY cat.name;

 

 

P.S.

Un vēl tavā kodā $tmp vajag drukāt iekš IFa, šādi:

if ($tmp!=$row['nname']){
 $tmp=$row['nname'];
 echo "<h1>".$tmp."</h1><br />\n";
}
echo $row['kname']."<br />\n";

 

P.S.2

Vispār to ORDER BY tev nevajag, jo tiem cat.name pēc JOINa tāpat vienādiem jābūt pēc kārtas.

Edited by codez
Link to comment
Share on other sites

Bet tik un tā virsraksts ākā cat name atkārtojas līdz ar katru sub_cat name ;(

Kur vel varētu būt problēma?

 

 

EDIT: VISS SANaaca paldies liels!

 

A tu nevari man izstāstīt sīkāk par to tavu tabulu? Piemēram, kā caur admina paneli pievienos jaunas kateg un sadaļas, jo manliekas tur būs bik šarežģītāk tieši ar to kā tās sadaļas moderēt, varbūt tev ir gatavs kods?

Edited by test2
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...