andrisp Posted January 8, 2007 Report 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
Grey_Wolf Posted January 8, 2007 Report 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
andrisp Posted January 8, 2007 Author Report Posted January 8, 2007 Grey_Wolf, inner joinus māku daudz maz, bet īsti nemāku izdomāt kā tur iepīt IF.
Delfins Posted January 8, 2007 Report 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)
des Posted January 8, 2007 Report 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)
andrisp Posted January 8, 2007 Author Report 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.
hmnc Posted January 8, 2007 Report 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
andrisp Posted January 8, 2007 Author Report 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.
hmnc Posted January 8, 2007 Report Posted January 8, 2007 nēnu piemērā tak minēts, ka abas tabulas ir vienādas :)
bubu Posted January 8, 2007 Report 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"
Recommended Posts