Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [mysql] Podwojny klucz obcy
cornholio666
post
Post #1





Grupa: Zarejestrowani
Postów: 472
Pomógł: 8
Dołączył: 14.03.2004
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


Witam,

mam takie tabele

(IMG:http://bmsource.nazwa.pl/jj/smieci/help.jpg)


Chciałbym pobrać nazwe producenta z tabeli stop i start dla produktu nr 1

To zapytanie wyciaga nazwę producenta z tabeli start
  1. SELECT pr.nazwa FROM producent AS pr, produkt AS p,start WHERE p.produkt_id = 1 AND start.produkt_id = p.produkt_id AND pr.producent_id = start.producent_id



a jak pobrać jeszcze z tabeli stop?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Ja bym zrobił tak:

Tabela product:
  1. CREATE TABLE `test`.`product` (
  2. `id` INT( 4 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  3. `name` VARCHAR( 255 ) NOT NULL ,
  4. `description` TEXT NULL DEFAULT NULL
  5. ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci

Tabela producer:
  1. CREATE TABLE `test`.`producer` (
  2. `id` INT( 4 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  3. `name` VARCHAR( 255 ) NOT NULL ,
  4. `description` TEXT NULL DEFAULT NULL
  5. ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci

Tabela łącząca powyższe, producer_product:
  1. CREATE TABLE `test`.`producer_product` (
  2. `producer_id` INT( 4 ) NOT NULL ,
  3. `product_id` INT( 4 ) NOT NULL ,
  4. `deleted_at` DATETIME NULL DEFAULT NULL ,
  5. PRIMARY KEY ( `producer_id` , `product_id` )
  6. ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci
  7.  
  8. ALTER TABLE `producer_product` ADD FOREIGN KEY ( `producer_id` ) REFERENCES `test`.`producer` ( `id` );
  9.  
  10. ALTER TABLE `producer_product` ADD FOREIGN KEY ( `product_id` ) REFERENCES `test`.`product` ( `id` );


I teraz masz tak:

1. Dodajemy produkty:
  1. INSERT INTO `test`.`product` ( `id` , `name` , `description` )
  2. VALUES ( 1 , 'Omega', 'Fajna bryka' ), ( 2 , 'Punto', 'Lorem ipsum' ), ( 3 , 'Palio weekend', 'Bla bla' );

2. dodajemy producentów:
  1. INSERT INTO `test`.`producer` ( `id` , `name` , `description` )
  2. VALUES ( 1 , 'Opel', 'Marka I' ), ( 2 , 'Fiat', 'Bla bla' );

3. Łączymy:
  1. INSERT INTO `test`.`producer_product` ( `producer_id` , `product_id` , `deleted_at` )
  2. VALUES ( '1', '1', NULL ), ( '2', '2', NULL ), ( '2', '3', NULL );


Masz teraz wszystko jak na dłoni.
Możesz łatwo łącząc tabele wyciągać producentów po produkcie, produkty po producentach, ...
Pamiętając że aktywny producent to ten, który ma `deleted_at` == NULL

Teraz chcesz zmienić producenta dla Omegi (id=1 w tabeli product) z Opla (id=1 w tabeli producer) na Fiata (id=2 w tabeli producer):
  1. UPDATE `producer_product` SET `deleted_at` = NOW( ) WHERE `producer_product`.`producer_id` =1 AND `producer_product`.`product_id` =1
  2.  
  3. INSERT INTO `test`.`producer_product` ( `producer_id` , `product_id` , `deleted_at` ) VALUES ( '1', '2', NULL );


Takim oto zabiegiem masz:
1. Zmienionego producenta;
2. Zachowanego ostatniego, starego producenta i łatwy dostęp do niego (wyszukujesz te rekordy, które sa usunięte, sortujesz po czasie usunięcia malejąco i dajesz limit na 1);
3. BONUS: Cała historię zamian.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 12:44