Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

2 tabele, join, Mysql

[es] :: MySQL :: 2 tabele, join, Mysql

[ Pregleda: 9417 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Kusur
Grafički dizajner
Beograd

Član broj: 2485
Poruke: 208
*.8.EUnet.yu



Profil

icon 2 tabele, join, Mysql27.09.2003. u 08:24 - pre 249 meseci
Pozdrav svima

Da li neko može da mi pomogne?

Treba mi SQL upit za (Mysql+php) ....

Dve tabele OBLASTI i KNJIGE - hteo bih na jednoj strani da izlistam prvo ime jedne oblasti, pa sve knjige iz te oblasti .... pa tako redom sve oblasti, np. ovako:

OBLAST 1
Knjiga 1.1
Knjiga 1.2
Knjiga 1.3

OBLAST 2
Knjiga 2.1
Knjiga 2.2
Knjiga 2.3

itd ..


Unapred hvala
Kusur
 
Odgovor na temu

jeremy
igor jeremic
Beograd

Član broj: 3740
Poruke: 73
*.beotel.net

ICQ: 13289333
Sajt: www.jwork.net


Profil

icon Re: 2 tabele, join, Mysql27.09.2003. u 10:24 - pre 249 meseci
Zdravo,

ne vidim razlog zbog cega bi koristio dve tabele, jednostavnije je da u jednoj drzis sve, i razlicitim select upitima izvlacis ono sto ti treba. Evo ti par upita za kreiranje, punjenje i ispis, ako sam pogodio sta tacno zelis
----------------------

create database bibl;
use bibl;

CREATE TABLE knjige (
id int NOT NULL auto_increment,
knjiga varchar(50) default NULL,
oblast int NOT NULL,

UNIQUE KEY id (id)
);

INSERT INTO knjige VALUES(NULL,"Knjiga 1.1",1);
INSERT INTO knjige VALUES(NULL,"Knjiga 1.2",1);
INSERT INTO knjige VALUES(NULL,"Knjiga 1.2",1);

INSERT INTO knjige VALUES(NULL,"Knjiga 2.1",2);
INSERT INTO knjige VALUES(NULL,"Knjiga 2.2",2);
INSERT INTO knjige VALUES(NULL,"Knjiga 2.3",2);

select * from knjige where oblast=1;

select * from knjige where oblast=2;

Igor Jeremic
www.jwork.net
 
Odgovor na temu

Kusur
Grafički dizajner
Beograd

Član broj: 2485
Poruke: 208
*.27.EUnet.yu



Profil

icon Re: 2 tabele, join, Mysql27.09.2003. u 11:05 - pre 249 meseci
Hvala

Ok napravio sam novu tabelu za probu:

id knjiga oblast
1 Knjiga 1 1
2 Knjiga 2 1
3 Knjiga 3 1
4 Knjiga 4 2
5 Knjiga 5 2

Znači tri knjige u oblasti 1 i dve knjige u oblasti 2

Moj upit:

SELECT distinctrow id, knjiga, oblast
FROM knjige1
GROUP BY id, oblast

Rezultat:

1
Knjiga 1
1
Knjiga 2
1
Knjiga 3
2
Knjiga 4
2
Knjiga 5


A želeo bih ovako:

1
Knjiga 1
Knjiga 2
Knjiga 3

2
Knjiga 4
Knjiga 5

Znači na jednoj strani sa jednim upitom izlistati ime(broj) oblasti pa imena svih knjiga iz te oblasti, pa zatim ime druge oblasti (broj) pa imena svih knjiga iz te oblasti i tako redom...

Mada ja već u bazi imam dve tabele sa podacima, pa ne znam, kako bih to sada spoio u jednu tabelu, i zato pokušavam da dobijem ovakav rezultat iz dve tabele



Kusur
 
Odgovor na temu

bluesman

Član broj: 4505
Poruke: 1895
*.121.EUnet.yu



+1 Profil

icon Re: 2 tabele, join, Mysql27.09.2003. u 23:18 - pre 249 meseci
Citat:
jeremy:
ne vidim razlog zbog cega bi koristio dve tabele, jednostavnije je da u jednoj drzis sve, i razlicitim select upitima izvlacis ono sto ti treba. Evo ti par upita za kreiranje, punjenje i ispis, ako sam pogodio sta tacno zelis

CREATE TABLE knjige (
id int NOT NULL auto_increment,
knjiga varchar(50) default NULL,
oblast int NOT NULL,

UNIQUE KEY id (id)
);

INSERT INTO knjige VALUES(NULL,"Knjiga 1.1",1);
...
select * from knjige where oblast=1;


Mislim da si zbunio coveka, jer ovo tvoje resenje je sa 2 tabele (a ti kazes da treba samo jedna). Druga tabela ti je OBLASTI (ili kategorije) gde mora da pise kako se koja kategorija zove.

dakle moras imati jos jednu tabelu

create table kategorije (
cat_id int unsigned not null auto_increment,
naziv varchar(30)

primary key (cat_id)
);

Ovako kako si ti predlozio njegove kategorije (oblasti) se pojavljuju na sajtu pod nazivima 1, 2, 3.... sto je neprihvatljivo, zar ne. Zatim, ako imas auto increment, on treba biti unsigned.

Dalje, ako zelis da jedna knjiga moze pripadati u vise kategorija, treba ti i treca table, a iz prve izbacis kolonu oblast. dakle:

CREATE TABLE knjige (
id_knjige int unsigned NOT NULL auto_increment,
naziv_knjige varchar(50) default NULL,
PRIMARY KEY (id_knjige)
);

CREATE TABLE oblasti (
id_oblasti int unsigned NOT NULL auto_increment,
naziv_oblasti varchar(50) default NULL,
PRIMARY KEY (id_oblasti)
);

CREATE TABLE knjige_oblasti (
id_knjige int unsigned NOT NULL DEFAULT 0,
id_oblasti int unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (id_knige, id_oblasti)
);

pa kada citas knjige iz neke oblasti 1 citas sa:

select ko.*, k.*, o.* from knige_oblasti as ko
left join knjige as k on (ko.id_knjige = k.id_knjige)
left join oblasti as o on (ko.id_oblasti = o.id_oblasti)
where ko.oblast_id = 1

i tako dobijas kompletan slog za odredjenu knjigu.

ako citas kojim sve oblastima pripada odredjena kniga 5:

select ko.*, o.* from knjige_oblasti as ko
left join oblasti as o on (ko.id_oblasti = o.id_oblasti)
where ko.id_knjige = 5

ako hoces da recimo jedna knjiga (38) pripada u oblasti 1, 7 ,49 samo u knjige_oblasti dodase sve te parove

insert into knjige_oblasti values (38, 1);
insert into knjige_oblasti values (38, 7);
insert into knjige_oblasti values (38, 49);

itd... da ne gusim dalje.

Ovo su fundamentalne (osnovne) stvari u relacionim bazama podataka i trebalo bi dobro prouciti odnose izmedju tabela pre nego sto pocnes da pises aplikaciju (DBMS). Postoje veze 1-to-many, many-to-1, i manu-to-many. Ovo sto tebi treba je many-to-many jer u jednoj oblasti moze biti vise knjiga a jedna knjiga moze pripadati vise oblasti.

Goran Pilipović fka bluesman
 
Odgovor na temu

popeye
Branko Ivanović
Beograd

Član broj: 3846
Poruke: 960
*.bitsyu.net

Jabber: popeye@elitesecurity.org
ICQ: 18038966
Sajt: popeye.linuxo.org


Profil

icon Re: 2 tabele, join, Mysql27.09.2003. u 23:25 - pre 249 meseci
Izvlaci oblasti u petlji, preko koje izvlacis knjige.
 
Odgovor na temu

bluesman

Član broj: 4505
Poruke: 1895
*.121.EUnet.yu



+1 Profil

icon Re: 2 tabele, join, Mysql27.09.2003. u 23:42 - pre 249 meseci
Ma jok bre, kakve petlje. Zamisli 100 kategorija i u svakoj ima po 1000 kniiga. To je 1001 query za jedan ispis. Osim ako ti je sve jedno ako dodje neki administrator sa ISP gde hostujes takav site da te rokne :-) Ili cak neki korisnik koji ce takvu stranu da ceka 2 sata da se ucita.

Sve to dobijas iz jednog jedinog query-ja, a onda ispisujes iz jedne jedine petlje.
Goran Pilipović fka bluesman
 
Odgovor na temu

Kusur
Grafički dizajner
Beograd

Član broj: 2485
Poruke: 208
*.29.EUnet.yu



Profil

icon Re: 2 tabele, join, Mysql27.09.2003. u 23:46 - pre 249 meseci
Znači ovo ne može da se izvede sa dve tabele?


*Napomena
Jedna knjiga može da pripada samo jednoj oblasti.
Kusur
 
Odgovor na temu

dinol
Bosna

Član broj: 8764
Poruke: 46
*.as54.ze-old.bih.net.ba.

ICQ: 172716691


Profil

icon Re: 2 tabele, join, Mysql28.09.2003. u 15:53 - pre 249 meseci
momak očito da bi malo trebao da pročitaš i teorije o relacionim bazama podataka.
Jer tabele se ne redaju samo tako... bez ikakvog reda!

probaj sa google, ja sam probao ima i na nasem jeziku.
Don Dino - il consigliere
 
Odgovor na temu

dinol
Bosna

Član broj: 8764
Poruke: 46
*.as54.ze-old.bih.net.ba.

ICQ: 172716691


Profil

icon Re: 2 tabele, join, Mysql28.09.2003. u 15:58 - pre 249 meseci
i bluesman ti je vec i previse dobro odgovorio na ovo
Don Dino - il consigliere
 
Odgovor na temu

noviKorisnik
Dejan Katašić
Novi Sad

Član broj: 13216
Poruke: 4533
*.25.EUnet.yu

Sajt: www.novikorisnik.net


+5 Profil

icon Re: 2 tabele, join, Mysql28.09.2003. u 17:22 - pre 249 meseci
Citat:
Kusur:
Znači ovo ne može da se izvede sa dve tabele?
*Napomena
Jedna knjiga može da pripada samo jednoj oblasti.

Uz ovu napomenu sve se i izvodi s 2 tabele (knjige, oblasti). Svaka knjiga pripada tačno jednoj oblasti, tako da u svom zapisu u bazi ima polje koje pokazuje na oblast kojoj pripada. Oblasti u svom zapisu imaju ime, opis, itd.
Sve se povlači u jednom upitu, a način ispisa se reguliše PHP.
Code:
upit:
SELECT
 k.ime AS k_ime, k.ostalo AS k_ostalo,
 o.ime AS o_ime, o.ostalo AS o_ostalo
FROM knjige AS k, oblasti AS o
WHERE k.oblast = o.id
ORDER BY o.id, k.id

Znači, jednostavno spajanje tabela i prihvatanje podataka. Za ispis:
Code:

$bibl = mysql_query ($sql_str);  // $sql_str je gornji upit

//  ako nema knjiga, prekidamo
if (mysql_num_rows ($bibl) < 1) die ('prazna biblioteka');

//  inače sledi ispis
$rb_o = 0;  // redni broj oblasti za ispis
$ime_o = '';

while ($knjiga = mysql_fetch_assoc ($bibl))
{
  extract ($knjiga);
  if ($ime_o != $o_ime)  //  nova oblast
  {
    if ($rb_o > 0) echo "</ol>\n";
    $rb_o++;
    $ime_o = $o_ime;
    echo "<h4>Oblast $rb_o: $ime_o, $o_ostalo</h4>\n<ul>\n";
  }
  echo "<li>$k_ime, $k_ostalo</li>\n";
}
echo "</ol>\n";

Ovo daje ispis
Oblast 1: ime oblasti, i ostalo
1. ime knjige i ostalo
2. ime knjige i ostalo
3. ime knjige i ostalo
...
Oblast 2: ime oblasti, i ostalo
1. ime knjige i ostalo
2. ime knjige i ostalo
3. ime knjige i ostalo
...
...
I može da dobro deluje dok je biblioteka mala. Za veliku biblioteku ne bi bio primeren ispis hiljade naslova na jednoj stranici, to već zahteva drugačiji pristup.
 
Odgovor na temu

bluesman

Član broj: 4505
Poruke: 1895
*.75.EUnet.yu



+1 Profil

icon Re: 2 tabele, join, Mysql28.09.2003. u 18:53 - pre 249 meseci
Citat:
Kusur:
Znači ovo ne može da se izvede sa dve tabele?


*Napomena
Jedna knjiga može da pripada samo jednoj oblasti.

Ako jedna knjiga moze samo u jednoj oblasti onda mozes sa 2 tabele, cak i sa jednom, ali onda moras da cuvas i ime oblasti u tom polju (ne id), ali ovo drugo resenje ti ne preporucujem.

J....ga, mislio sam da sam lepo objasnio, a ocigledno me nisi razumeo. Zali boze vremena koje sam potrosio na tom odgovoru...
Goran Pilipović fka bluesman
 
Odgovor na temu

Kusur
Grafički dizajner
Beograd

Član broj: 2485
Poruke: 208
*.10.EUnet.yu



Profil

icon Re: 2 tabele, join, Mysql28.09.2003. u 19:43 - pre 249 meseci
Hvala svima na pomoći!

Izvinjavam se ako sam vam oduzeo dragoceno vreme, ja sam početnik i nisam programer. Zato i pokušavam da nađem odgovor na ovom forumu - uvek se nađe neko ko želi da pomogne.

Pozdrav
Kusur
 
Odgovor na temu

[es] :: MySQL :: 2 tabele, join, Mysql

[ Pregleda: 9417 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.