Wyświetlenie różnic z 2 tabel MySQL

0

Witam serdecznie,
Mam 2 tabele:

 
CREATE TABLE `zamowienia` (
  `gt_id` bigint(20) UNSIGNED NOT NULL,
  `id_firmy` bigint(20) NOT NULL,
  `id_obiektu` bigint(20) NOT NULL,
  `id_rekordu` bigint(20) NOT NULL DEFAULT '0',
  `stan` char(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  `wybrane` bigint(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


ALTER TABLE `zamowienia`
  ADD PRIMARY KEY (`gt_id`),
  ADD UNIQUE KEY `gt_id` (`gt_id`),
  ADD KEY `gt_id_2` (`gt_id`);


ALTER TABLE `zamowienia`
  MODIFY `gt_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
  
  

CREATE TABLE `aneksy` (
  `gt_id` bigint(20) UNSIGNED NOT NULL,
  `id_firmy` bigint(20) NOT NULL,
  `id_obiektu` bigint(20) NOT NULL,
  `id_rekordu` bigint(20) NOT NULL DEFAULT '0',
  `id_zamowienia` bigint(20) NOT NULL DEFAULT '0',
  `stan` char(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  `wybrane` bigint(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


ALTER TABLE `aneksy`
  ADD PRIMARY KEY (`gt_id`),
  ADD UNIQUE KEY `gt_id` (`gt_id`),
  ADD KEY `gt_id_2` (`gt_id`);


ALTER TABLE `aneksy`
  MODIFY `gt_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;

W tabeli zamówienia - mam zamówione elementy. W tabeli aneksy z kolei mam zapisane zmiany w stosunku do tabeli zamowienia.

Tabela aneksy i zamowienia powiązane są za pomocą aneksy.id_zamowienia = zamowienia. gt_id

w kolumnie "wybrane" przetrzymuję ID parametrów, a w "stan" wartości 1 (wybrane) oraz 2 (nie wybrane).

Potrzebuję wyświetlić raport (listę wyników) z informacją które elementy zostały zmienione, a które nie...

Wie ktoś może jak powinno wyglądać takie zapytanie MySQL?

0

Nie wiem czy chodzi Tobie o coś takiego, ponieważ opis jest trochę niejasny, ale jeżeli nie to może pomoże Ci to w realizacji.

select zam.gt_id, case when (an.gt_id is null) then 'Niezmienione' else 'Zmienione' end as 'Status' 
from zamowienia zam
left join aneksy an on zam.gt_id = an.id_zamowienia
group by zam.gt_id
 
0

chodzi mi o to że mam 2 tabele. Pierwotne zamówienia (zamowienia) i zmiany na nich naniesione (aneksy).
Potrzebuję wyświetlić zmiany i rekordy z zamówieniami :)

0

przykładowe dane w tabelach i co chcesz otrzymać w wyniku (też jako dane a nie opis)

0
Northwest napisał(a):

chodzi mi o to że mam 2 tabele. Pierwotne zamówienia (zamowienia) i zmiany na nich naniesione (aneksy).
Potrzebuję wyświetlić zmiany i rekordy z zamówieniami :)

Też nie do końca rozumiem co chcesz osiągnąć. Czy wiesz do czego służy EXISTS?
Pozdrawiam

0

chcę znaleŹć różnicę w tych 2 tabelach ;) co zostało zmienione

0

Coś w stylu:

SELECT z.gt_id,
case when a.gt_id IS NULL then 'usuniety' else 'jest' end,
CASE WHEN a.id_firmy<>z.id_firmy THEN 'zmieniona firma' end,
...
FROM zamowienia z LEFT JOIN aneksy a ON z.gt_id=a.gt_id

Możesz ta zrobić dla pól NOT NULL, dla nullowych musisz jeszcze null obsłużyć.

0
Northwest napisał(a):

chcę znaleŹć różnicę w tych 2 tabelach ;) co zostało zmienione

Co to jest dla Ciebie różnica?

Do wyświetlenia rekordów które są w jednej a nie ma ich w drugiej tabeli może być pomocne EXISTS - ale nie
wiem czy właśnie to dla Ciebie są różnice.

Pozdrawiam

0

Jeśli szukasz tych rekordów w jednej tabeli, których nie ma (alb są) w drugiej, to tak:

\c postgres;
DROP DATABASE IF EXISTS diffs;
DROP ROLE IF EXISTS diffs;

CREATE ROLE diffs PASSWORD 'diffs' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;
CREATE DATABASE diffs OWNER diffs ENCODING 'UTF-8';
\c diffs;
set role diffs;

create or replace function random_string(length integer) returns text as 
$$
declare
  chars text[] := '{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,R,S,T,U,V,W,X,Y,Z}';
  result text := '';
  i integer := 0;
begin
  for i in 1..length loop
    result := result || chars[1+random()*(array_length(chars, 1)-1)];
  end loop;
  return result;
end;
$$ language plpgsql;


CREATE SEQUENCE seq_word1 START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
CREATE SEQUENCE seq_word2 START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;

CREATE TABLE words1 (
    id      bigint DEFAULT nextval('seq_word1') NOT NULL,
    word    character varying(4) NOT NULL
);

CREATE TABLE words2 (
    id      bigint DEFAULT nextval('seq_word1') NOT NULL,
    word    character varying(4) NOT NULL
);



create or replace function mk_words() returns void as 
$$
declare
  i integer;
  tmp text;
begin
  for i in 1..100 loop
    tmp = random_string(2);
    execute 'insert into words1 (word) values($1)' using tmp;
    tmp = random_string(2);
    execute 'insert into words2 (word) values($1)' using tmp;
  end loop;
end;
$$ language plpgsql;


select mk_words();

select w1.word from words1 as w1 where w1.word not in (select w2.word from words2 as w2);
select w1.word from words1 as w1 where w1.word in (select w2.word from words2 as w2);

1 użytkowników online, w tym zalogowanych: 0, gości: 1