Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Podwojny klucz obcy
Forum PHP.pl > Forum > Przedszkole
cornholio666
Witam,

mam takie tabele




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?
mike
~cornholio666 powiedz co to za schemat.
Bo zamiast myśleć nad zapytaniem może powinieneś zmienić schemat bazy. Bo z tego co widzę to jakiś dziwoląg jest.
cornholio666
Powiedzmy ze jest jeden produkt który może mieć dwoch producentów. Przychodzi klient i mowi ze chce zmienic producenta swojego produktu.

start - producent jakiego mial wczesniej

stop - producent na jakiego chce zmienic

W produkcie ma byc zawarte jaki był wcześniej producent i zmiana na nowego (to jest na sztywno w kazdym produkcie)
mike
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.
cornholio666
mike mi chodzi o cos takiego


PRODUKT
id| producent_1 | producent_2 | kryterium_1 | kryterium_2 cena przy takiej zmianie
------------------------------------------------------------------------------------------------
1| opel | nissan | xxx | sss | 5000 zł
2| audi | bmw | qqq | ddd | 1 0000 zł


Musze mieć w jednym wierszu producent_1 (to co mam teraz) i producent_2 (na co chce zmienić)

Przychodzi koleś do mnie mówi: "chce zmienić opla na nissana" . Szukam producent_1 = opel producent_2 = nissan mowie mu "to bedzie kosztować 5000 zł."

Przy twojej strukturze nie jestem w stanie stwierdzić z jakiego produktu chce przyejsc na jaki. Tutaj jeden słownik producent musi być przypisany 2 razy do tabeli PRODUKT.
Cienki1980
A takie coś nie zadziała questionmark.gif
  1. SELECT pr_start.nazwa AS start_nazwa, pr_stop.nazwa AS stop_nazwa,p.pole FROM produkt p
  2. INNER JOIN start ON p.produkt_id=start.produkt_id
  3. INNER JOIN producent pr_start ON start.producent_id=pr_start.producent_id
  4. INNER JOIN stop ON p.produkt_id=stop.produkt_id
  5. INNER JOIN producent pr_stop ON stop.producent_id=pr_stop.producent.id
cornholio666
Cienki1980 dzięki o to chodziło guitar.gif

Wkradła ci się literówka:

  1. INNER JOIN producent pr_stop ON stop.producent_id=pr_stop.producent_id
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.