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




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?


--------------------
I need TP for my bunghole!!!

Mój nowy przyjaciel - tytanowa płytka na stałe
------------------------------------------------------
AEGEE, kwiaciarnia rzeszów , notariusz rzeszów, zakład krawiecki rzeszów, paweł jakubowicz
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
mike
post
Post #2





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

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


~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.
Go to the top of the page
+Quote Post
cornholio666
post
Post #3





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

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


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)


--------------------
I need TP for my bunghole!!!

Mój nowy przyjaciel - tytanowa płytka na stałe
------------------------------------------------------
AEGEE, kwiaciarnia rzeszów , notariusz rzeszów, zakład krawiecki rzeszów, paweł jakubowicz
Go to the top of the page
+Quote Post
mike
post
Post #4





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
cornholio666
post
Post #5





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

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


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.


--------------------
I need TP for my bunghole!!!

Mój nowy przyjaciel - tytanowa płytka na stałe
------------------------------------------------------
AEGEE, kwiaciarnia rzeszów , notariusz rzeszów, zakład krawiecki rzeszów, paweł jakubowicz
Go to the top of the page
+Quote Post
Cienki1980
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


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


--------------------
404
Go to the top of the page
+Quote Post
cornholio666
post
Post #7





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

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


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


--------------------
I need TP for my bunghole!!!

Mój nowy przyjaciel - tytanowa płytka na stałe
------------------------------------------------------
AEGEE, kwiaciarnia rzeszów , notariusz rzeszów, zakład krawiecki rzeszów, paweł jakubowicz
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 06:35