andrisp Posted January 8, 2007 Report Share Posted January 8, 2007 (edited) Piemēram, ir četras tabulas: CREATE TABLE `items` ( `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY(`id`) ); CREATE TABLE `items_clients_rel` ( `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, `items_id` INTEGER UNSIGNED NOT NULL, `client_type` VARCHAR(5) NULL, `client_id` INTEGER UNSIGNED NULL, PRIMARY KEY(`id`), INDEX `items_clients_rel_FKIndex1`(`items_id`) ); CREATE TABLE `clients_ind` ( `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NULL, PRIMARY KEY(`id`) ); CREATE TABLE `clients_jur` ( `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NULL, PRIMARY KEY(`id`) ); Nespēju izdomāt kā lai uzraksta kveriju tā, lai atgriezts tiktu items.id | clients_ind.name vai clients_jur.name atkarībā no tā kāds ir items_clients_rel.client_type. Kāds varētu man parādīt piemēru kā šādus kverijus rakstīt ? Edited January 8, 2007 by andrisp Link to comment Share on other sites More sharing options...
Grey_Wolf Posted January 8, 2007 Report Share Posted January 8, 2007 (edited) hmm.. nkas ar tevi? Manupraat INNER JOIN un viss... P.S. shas paskatiishu... edit: man sodien gruti (SAPACHAATS AR ZALII).. parbaudi uz NULL ... Inerr join + IF parbaude uz NULL ... Njemot veeraa ka tev tabulii var buut NULL tad to var izcekot... edit2: mazliet text edit... Edited January 8, 2007 by Grey_Wolf Link to comment Share on other sites More sharing options...
andrisp Posted January 8, 2007 Author Report Share Posted January 8, 2007 Grey_Wolf, inner joinus māku daudz maz, bet īsti nemāku izdomāt kā tur iepīt IF. Link to comment Share on other sites More sharing options...
Delfins Posted January 8, 2007 Report Share Posted January 8, 2007 nevis inner, bet outer. select from A outer join B ON (A.type is not null AND A.ref_id = B.id) Link to comment Share on other sites More sharing options...
des Posted January 8, 2007 Report Share Posted January 8, 2007 Es drīzāk clients_ind un clients_jur taisītu kā vienu tabulu un to pazīmi client_type liktu tajā tabulā. Bet vismaz priekš 5. mysql risinājums ir tāds: SELECT CASE r.client_type WHEN 1 THEN CONCAT(i.id, ci.name) WHEN 2 THEN CONCAT(i.id, cj.name) END Klienc FROM items_clients_rel r LEFT JOIN items i ON (i.id = r.items_id) LEFT JOIN clients_ind ci ON (ci.id = r.client_id) LEFT JOIN clients_jur cj ON (cj.id = r.client_id) Link to comment Share on other sites More sharing options...
andrisp Posted January 8, 2007 Author Report Share Posted January 8, 2007 des, ja man būtu iespēja, es klientu identifikācijas numurus glabātu vispār atsevišķā tabulā. Tad atkristu vajadzība tabulās pēc laukiem client_type utt, bet diemžēl papildinu jau esošu sistēmu, kur pārveide būtu pārāk liela sāpe. Bet paldies par piemēru, tūlīt pat pārbaudīšu. Delfins, es domāju savādāk. Link to comment Share on other sites More sharing options...
hmnc Posted January 8, 2007 Report Share Posted January 8, 2007 mja. tabulu struktūra galīgi neloģiska. jēga no type_id un dalīt visu divās tabulās + tas jau defaultā norāda, ka būs jānorāda kāds tips tiek atselectēts, jo ID lielākajā daļā gadījumu pārklāsies. paskaties vai tiešām nav mazāks analpain pārtaisīt esošo. moš tur pāris queriji jānomaina Link to comment Share on other sites More sharing options...
andrisp Posted January 8, 2007 Author Report Share Posted January 8, 2007 Dalīt klientus divās tabulās man liekas normāli un loģiski, jo no juridiskām personām tiek prasīta pavisam savādāka veida informācija nekā no fiziskām. Tikai manā piemērā novienkāršoju līdz vienam laukam name. Tikai es tad taisītu šādi: clients: id | vajadzības gadijumā te var iebāzt arī kādu vispārīgu klienta informāciju clients_ind: id | clients_id | bla | bla | bla clients_jur: id | clients_id | bla2 | bla2 | bla2 Tad visur varētu norādīt uz clients.id . PS. Tā sistēma tiešām ir liela un kveriju tur ir daudzdesmitiem ja pat ne pāri simtam. Link to comment Share on other sites More sharing options...
hmnc Posted January 8, 2007 Report Share Posted January 8, 2007 nēnu piemērā tak minēts, ka abas tabulas ir vienādas :) Link to comment Share on other sites More sharing options...
bubu Posted January 8, 2007 Report Share Posted January 8, 2007 Imho šādi: SELECT items.id CASE ic.client_type WHEN "ind" THEN ci.name WHEN "jur" THEN cj.name END CASE AS name FROM items JOIN items_clients_rel AS ic ON items.id = ic.items_id LEFT JOIN clients_ind AS ci ON ic.client_id = ci.id AND ic.client_type="ind" LEFT JOIN clients_jur AS cj ON ic.client_id = cj.id AND ic.client_type="jur" Link to comment Share on other sites More sharing options...
Recommended Posts