Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Problem ze zbudowaniem odpowiedniego zapytania MySQL
cent4
post
Post #1





Grupa: Zarejestrowani
Postów: 415
Pomógł: 0
Dołączył: 24.12.2008

Ostrzeżenie: (10%)
X----


Witam.
Mam problem ze zbudowaniem odpowiedniego zapytania nad którym siedzę już dobrych parę dni.
Tworzę małą bibliotekę i mam 2 tabele:
"historia" i "czyteln"
Tabela "historia" ma pola: "Nr_czyt", "Data_wyp"
Tabela "czyteln" ma pola: "Nr_czyt", "Imie", "Nazwisko".

Cel jaki chcę osiągnąć: Jest formularz w którym określam rok i miesiąc - chcę dla podanej daty (rok i miesiąc) mieć wylistowanych wszystkich czytelników, którzy nic nie wypożyczyli w tym okresie - tzn. których Nr_czyt za dany okres nie istnieje w tabeli historia.

Kompletnie nie wiem jak to zrobić.


Zrobiłem inne zapytanie, które listuje mi liczbę wypożyczeń użytkowników, którzy coś wypożyczyli - coś w rodzaju - "Kto najwięcej wypożyczył w podanym okresie" i z tym nie ma problemu:
SELECT h.Nr_czyt, c.Imie, c.Nazwisko, COUNT( * ) AS l_wyp FROM historia AS h JOIN czyteln AS c ON h.Nr_czyt = c.Nr_czyt
WHERE (DATE_FORMAT(h.Data_wyp,'%Y-%m') = '$rok-$miesiac') GROUP BY c.Imie, c.Nazwisko, c.Nr_czyt").

Ale jak zrobić listę czytelników, którzy nic nie wypożyczyli - NIE WIEM.

Proszę o pomoc...
Go to the top of the page
+Quote Post
morbic
post
Post #2





Grupa: Zarejestrowani
Postów: 116
Pomógł: 29
Dołączył: 13.12.2010
Skąd: Warszawa

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


Zerknij na http://pl.wikipedia.org/wiki/Join_(SQL)

Słowo-klucz: OUTER
Go to the top of the page
+Quote Post
BaN
post
Post #3





Grupa: Zarejestrowani
Postów: 158
Pomógł: 43
Dołączył: 9.11.2007

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


Albo NOT EXISTS
Go to the top of the page
+Quote Post
morbic
post
Post #4





Grupa: Zarejestrowani
Postów: 116
Pomógł: 29
Dołączył: 13.12.2010
Skąd: Warszawa

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


Fakt, nawet lepiej i prościej (IMG:style_emoticons/default/specool.gif)
Go to the top of the page
+Quote Post
cent4
post
Post #5





Grupa: Zarejestrowani
Postów: 415
Pomógł: 0
Dołączył: 24.12.2008

Ostrzeżenie: (10%)
X----


Jak to zapisać poprawnie z użyciem NOT EXISTS?
Go to the top of the page
+Quote Post
Adi32
post
Post #6





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


  1. SELECT cos FROM cos WHERE cos NOT IN (SELECT id_czytelnika FROM czytelnicy)
Go to the top of the page
+Quote Post
cent4
post
Post #7





Grupa: Zarejestrowani
Postów: 415
Pomógł: 0
Dołączył: 24.12.2008

Ostrzeżenie: (10%)
X----


  1. SELECT DISTINCT h.Nr_czyt, c.Imie, c.Nazwisko FROM historia AS h JOIN czyteln AS c ON h.Nr_czyt = c.Nr_czyt
  2. WHERE (DATE_FORMAT(h.Data_wyp,'%Y-%m') = '2010-08') NOT IN (SELECT Nr_czyt FROM czyteln)


Niestety nie działa (IMG:style_emoticons/default/sad.gif) - wypisuje wszystkich czuytelników, nawet tych, którzy coś wypożyczyli...

Adi32 jak zastosować poprawnie Twoją radę - tak jak pisałem wcześniej nie udaje mi się to - chyba coś ze składnią jest nie tak :-(

Ten post edytował cent4 3.07.2011, 22:10:12
Go to the top of the page
+Quote Post
Adi32
post
Post #8





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


Przemyśl budowę tego zapytania, będzie działać.

  1. SELECT t1.czystelnicy, t2.cos_innego FROM jakas_tabela t1, jakas_tabela2 t2 WHERE id_usera NOT IN (SELECT id_usera FROM historia WHERE data_wyp = 'dany okres')


Ten post edytował Adi32 4.07.2011, 09:52:29
Go to the top of the page
+Quote Post
cent4
post
Post #9





Grupa: Zarejestrowani
Postów: 415
Pomógł: 0
Dołączył: 24.12.2008

Ostrzeżenie: (10%)
X----


Wywołuję takie zapytanie ale dostaję mnóstwo informacji :-(

SELECT DISTINCT h.Nr_czyt, c.Imie, c.Nazwisko FROM czyteln c, historia h WHERE c.Nr_czyt NOT IN (SELECT DISTINCT Nr_czyt FROM historia WHERE DATE_FORMAT(Data_wyp,'%Y-%m') = '2010-08')
Go to the top of the page
+Quote Post
Adi32
post
Post #10





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


Cytat(cent4 @ 4.07.2011, 11:03:02 ) *
Wywołuję takie zapytanie ale dostaję mnóstwo informacji :-(

  1. SELECT DISTINCT h.Nr_czyt, c.Imie, c.Nazwisko FROM czyteln c, historia h WHERE c.Nr_czyt NOT IN (SELECT DISTINCT Nr_czyt FROM historia WHERE DATE_FORMAT(Data_wyp,'%Y-%m') = '2010-08')


spróbuj wpisać na sztywno jakąś datę (zgodnie z formatem w bazie), bez DATE_FORMAT
Go to the top of the page
+Quote Post
cent4
post
Post #11





Grupa: Zarejestrowani
Postów: 415
Pomógł: 0
Dołączył: 24.12.2008

Ostrzeżenie: (10%)
X----


też całe mnóstwo danych.
Ale date format musi być - bowiem podaję tylko rok i miesiąc, a są jeszcze dni i dni muszą być wszystkie z danego miesiąca uwzględniane - więc musi to działać z date format
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




  1. SELECT c.imie, c.nazwisko FROM czytelnik c WHERE c.nr_czyt NOT IN (SELECT h.nr_czyt FROM historia h WHERE DATE_FORMAT(h.Data_wyp,'%Y-%m') = '2010-08')
Go to the top of the page
+Quote Post
cent4
post
Post #13





Grupa: Zarejestrowani
Postów: 415
Pomógł: 0
Dołączył: 24.12.2008

Ostrzeżenie: (10%)
X----


nospor dziękuję bardzo.
Wszystko działa dokładnie tak jak chciałem.
Dziękuję jeszcze raz.
Go to the top of the page
+Quote Post

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: 22.08.2025 - 21:18