Jump to content
php.lv forumi

Nepieciešams izvilkt datus no 4 tabulām ar 1 query


AndzX8-842

Recommended Posts

Te ir tabulas.

--
-- Table structure for table `users`
--
CREATE TABLE users (
 id int(10) unsigned NOT NULL auto_increment,
 username varchar(40) NOT NULL default '',
 password varchar(40) NOT NULL default '',
 email varchar(255) NOT NULL default '',
 signature TEXT,
 status tinyint(1) unsigned NOT NULL default '0',
 added datetime NOT NULL default '0000-00-00 00:00:00',
 last_login datetime NOT NULL default '0000-00-00 00:00:00',
 last_access datetime NOT NULL default '0000-00-00 00:00:00',
 ip varchar(15) NOT NULL default '',
 class tinyint(1) unsigned NOT NULL default '1',
 avatar varchar(255) NOT NULL default '',
 warned tinyint(1) NOT NULL default '0',
 PRIMARY KEY  (id)
) TYPE=MyISAM;

CREATE TABLE fleet {
 id int(10) unsigned NOT NULL auto_increment,
 fleet_name varchar(255) NOT NULL default '',
 fleet_commander_id int(10) NOT NULL default '',
 PRIMARY KEY  (id)
} TYPE=MyISAM;
--
-- Table structure for table `divisions`
--
CREATE TABLE divisions {
 id int(10) unsigned NOT NULL auto_increment,
 fleet_id int(10) unsigned NOT NULL default '',
 division_name varchar(255) NOT NULL default '',
 division_commander_id int(10) unsigned NOT NULL default '',
 PRIMARY KEY  (id)
} TYPE=MyISAM;
--
-- Table structure for table `dmembers`
--
CREATE TABLE dmembers {
 id int(10) unsigned NOT NULL auto_increment,
 division_id int(10) unsigned NOT NULL default '',
 user_id int(10) unsigned NOT NULL default '',
 PRIMARY KEY  (id)
} TYPE=MyISAM;

 

Nepieciešams ar vienu query izvilkt informāciju šādā secībā.

 

Izvilkt infromāciju no fleet tabulas, tad pēc fleet_commander_id atrast tādu pašu id users tabulā un izvilkt tās tabulas rindas informāciju, tad no divisions tabulas atrast rindu\rindas, kam ir tāds pats fleet_id kā id fleet tabulā un izvilt tās\to rindas\rindu informāciju, pēc divisions tabulā atrodamā id atras dmembers tabulā rindu vai rindas, kurās division_id sakrīt ar division tabulas id un izvilk to rindu\rindas informāciju, tad pēc dmembers tabulas izvilktās informācijas izvilkt no users tabulas visas rindas, kurās users tabulā id sakrīt ar dmembers tabulas division_member_id.

 

Dikti sarežģīti man tas viss izklausās, jo nav bijis vajadzīgs iepriekš taisīt tik sarežģītu query. Ļoti noderētu palīdzība. Šo to pamēģināju ar 2 tabulām un apmēram sanāca, bet ar 4 vienā query man tas JOIN\ON\AS ir par sālītu. :(

 

Kāds tas query kods izskatītos?

Edited by AndzX8-842
Link to comment
Share on other sites

kverija rezultāts ir tabula - nevis koks, neiedziļinoties izklausās ka gribi dabūt arā kokveida struktūru.

 

un kāpēc atkal ar 1nu kveriju - taisi ar cik māki

Edited by v3rb0
Link to comment
Share on other sites

Tāpēc, ka ar vairākiem sanāktu tik daudz query, cik users no users tabulas kaut kur, piemēram pie divisions tabulas pieder, ja 100, tad 100 + kaut kas query. Tas ir nedaudz nenormāli un ja vairāki cilvēki apskatās to pašu lapu, tad ir klusais vājprāts.

Edited by AndzX8-842
Link to comment
Share on other sites

Rakstot pēc teksta, sanāca kaut kas tāds:

SELECT f.*,u.*,d.*,m.* FROM fleet f 
LEFT JOIN users u ON f.fleet_commander_id=u.id
LEFT JOIN division d ON f.id=d.fleet_id
LEFT JOIN dmembers m ON d.id=m.division_id
LEFT JOIN users s ON s.id=m.division_member_id

Link to comment
Share on other sites

Andz - ja tev vajag linkot tabulas pēc noteiktiem parametriem (users.id -> fleet.user_id) tad bez lefjoiniem neiztiksi. Aleksandra piemērs izskatās visprastākais, bet manuprāt vispareizākais :)

iesaku palasīt par tabulu joinošanu.

Link to comment
Share on other sites

×
×
  • Create New...