Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] Połączenie dwóch tabel i wyodrębnienie danych
zgRED
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.01.2007

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


Witam,

Mam problem z wyodrębnieniem danych na podstawie zapytania łączącego dwie tabele. W uproszczeniu wyglądają one następująco:

Tabela produkty:

  1. CREATE TABLE IF NOT EXISTS `produkty` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `user_id` int(11) NOT NULL,
  4. `status` varchar(255) CHARACTER SET latin2 NOT NULL DEFAULT 'inactive',
  5. `koszt` decimal(10,1) NOT NULL DEFAULT '0.0',
  6. PRIMARY KEY (`id`))


Tabela faktury:

  1. CREATE TABLE IF NOT EXISTS `faktury` (
  2. `ad` int(255) NOT NULL AUTO_INCREMENT,
  3. `user_id` int(11) NOT NULL,
  4. `id` int(10) NOT NULL DEFAULT '0',
  5. `kwota` decimal(10,1) NOT NULL DEFAULT '0.0',
  6. PRIMARY KEY (`ad`))


Chciałbym w efekcie uzyskać taki efekt: dane będą pobierane dla danego użytkownika z np. user_id=2. Wyświetlać mają się więc wszyskie produkty, poza produktami dodanym przez użytkownika sprawdzającego (WHERE produkty.user_id NOT LIKE '2'), o koszcie większym od 10000 (AND produkty.koszt>10000), o statusie aktywnym (AND produkty.status='active') - lecz tylko te produkty dla których sprawdzający użytkownik nie wystawił jeszcze faktur (wyświetlić tylko te rekordy dla których nie istnieją wpisy w tabeli faktury odpowiadające danym produktom (faktury.id) i użytkownikowi sprawdzającemu (faktury.user_id)).

Problem mój polega na tym, iż nie potrafię zdefiniować ostatniej część zapytania. Tabele złączyłem poprzez LEFT OUTER JOIN faktury ON produkty.id=faktury.id Nie potrafię jednak trafnie wykorzystać np. składni WHERE NOT EXISTS aby wyfiltrować produkty bez faktur. Liczyłbym na Waszą pomoc jeśli uda Wam się zrozumieć co mam w zamyśle - choć starałem się opisać to dość precyzyjnie (IMG:style_emoticons/default/wink.gif)

Pozdrawiam.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
zgRED
post
Post #2





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.01.2007

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


Nie, niestety to jeszcze nie to (IMG:style_emoticons/default/wink.gif)

Niestety dla przykładowych rekordów w tabelach problemu nie widać.

Dla sprawdzającego użytkownika z np. user_id=2, gdy w tabeli faktury istnieje wpis odpowiadający danemu 'produkty.id' z tabeli produkty, nawet gdy faktura nie była wystawiona na użytkownika sprawdzające (faktury.user_id!='2'), lecz została wystawiona dla tego samego produktu przez użytkownika z np. user_id='6' to niestety taki wpis też jest wyświetlany. Dodając jeden rekord do wcześniej przedstawionej tabeli faktury:

Tabela produkty uzupełniona będzie w ten sposób:
Cytat
id user_id status koszt
1 2 active 15000
2 2 active 12000
3 5 active 11000
4 6 active 16000
5 6 active 12000
6 3 active 11000

Tabela faktury uzupełniona będzie w ten sposób:
Cytat
ad user_id id kwota
1 2 3 11000
2 2 5 12000
3 6 1 15000
4 6 3 11000


Gdy sprawdza dane użytkownik nr 2 (user_id=2), wyświetlają się mu następujące produkty:
Cytat
id user_id status koszt
3 5 active 11000
4 6 active 16000
6 3 active 11000

Zamiast:
Cytat
id user_id status koszt
4 6 active 16000
6 3 active 11000

Nadprogramowo więc wyświetla się produkt z id=3, dla którego istnieje wpis w tabeli faktury, lecz przypisany jest do użytkownika z user_id=6 (niestety oba warunki: WHERE `faktury.ad` IS NULL OR (`faktury.ad` IS NOT NULL AND `produkty.user_id` != '2') są spełnione). Może jest jakieś inne rozwiązanie tego problemu od innej strony?

To jakiś koszmar... (IMG:style_emoticons/default/wink.gif)
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: 14.10.2025 - 06:56