Jump to content
php.lv forumi

Subselektēšana no dažādām tabulas atkarībā no lauka vērtības


andrisp

Recommended Posts

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 by andrisp
Link to comment
Share on other sites

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 by Grey_Wolf
Link to comment
Share on other sites

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

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

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

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

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

×
×
  • Create New...