Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php+mysql] Pobieranie danych z 2 tabel z warunkami
terreska
post 27.03.2007, 17:07:40
Post #1





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 23.07.2006

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


Próbowałam na różne sposoby wykonać zapytanie, które pobierało by dane z 2 tabel i wyświetlało je po spełnieniu określonych warunków.
Niestety za każdym razem jak coś poprawiałam (zmieniałam), to pojawiały się coraz to inne błędy.

Posiadam 2 tabele:
1. artykuly (id, tekst)
2. czytane (uzytkownik, data, tekst)

Chchiałabym aby zapytanie wyświetlało tekst z artykuly, pod warunkiem, że dany użytkownik w dzisiejszym dniu nie czytał już tego tekstu.
Przyjmijmy, że po zalogowaniu: użytkownik ($uzyt), dzisiejsza data ($dzis)

Bardzo proszę o pomoc doświadczonych.
Go to the top of the page
+Quote Post
Sokal
post 27.03.2007, 17:13:49
Post #2





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 8.02.2007

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


Po pierwsze baza (czy jej część) jest źle zaprojektowana winksmiley.jpg
Po co w czytanych powielać artykuł :|
Można by zrobić tak:
- artykul (id, tekst)
- czytane (uzytkownik, data, id)

winksmiley.jpg

A zapytanie to może takie:
Kod
select artykuly.* from artykuly, czytane where czytane.data!=$dzis and czytane.uzytkownik=$uzyt

Nie wiem czy będzie działało, ale ogólny sens w nim jest biggrin.gif
A może left join wykorzystać ? :|

Ten post edytował Sokal 27.03.2007, 17:17:56


--------------------
Jabber/E-Mail: dominiksokal[at]gmail.com | GG: #3795571
Go to the top of the page
+Quote Post
devnul
post 27.03.2007, 18:22:20
Post #3





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

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


@sokal: tekst w tabeli czytane to chyba właśnie id tekstu a nie treść artykułu - secundo to co podałeś nie będzie działało jeśli artykuł był czytany choćby sekunde wcześniej niż teraz (zakłądam że pole data to pole przechowujące czas w sekundach) pozatym twój kod wyświetli tylko te artykuły które były już czytane a te które czytane nie były zostaną pominięte.

w php musisz określić czas w sekundach dla początku dnia (czyli godziny 0 minut 0 sekund 0) jak to zrobić podpowie ci manual dla funkcji date
  1. SELECT `text` FROM `artykul` WHERE `id` NOT IN (SELECT `text_id` FROM `czytane` WHERE `user`=$user AND `date`<$date)


Ten post edytował devnul 27.03.2007, 18:23:31


--------------------
Profesjonaliści są przewidywalni...
strzeż się amatorów...
FL4SHB4CK - imprezy, galerie, lokale
Go to the top of the page
+Quote Post
terreska
post 27.03.2007, 20:15:02
Post #4





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 23.07.2006

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


devnul, zrobiłam tak jak napisałeś, to cały czas się wyświetlają artykuły.

Ten post edytował terreska 27.03.2007, 20:15:23
Go to the top of the page
+Quote Post
Neeke
post 27.03.2007, 20:52:30
Post #5





Grupa: Zarejestrowani
Postów: 124
Pomógł: 16
Dołączył: 22.02.2007
Skąd: Warszawa

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


mhh... W tym akorat jestem swiezak.. i zabardzo niedzialam wtym typie zlozenia ale kiedys napewno bede musial sie jeszcze podszkolic....
  • Polecam przerobienie struktury tabel…. Na :
  • artykuły(id, text)
  • czytane (id, data, idusera, idartykulu)
  • [font="Times"][/font]
  1. <?php
  2. $zad=mysql_query("select artykuly.id, artykuly.text, czytane.idartykulu, czytane.idusera, czy
    tane.data from artykoły INNER JOIN czytane ON artykuły.id=czytane.artykoly where czytane.iduser<’0’ and czytane.iduser>’0’ order by czytane.data"
    ); 
  3. ?>
Spróboj tego... ale nieobiecuje ze zaadziala poprawnie ... smile.gif


Ten post edytował Neeke 27.03.2007, 20:54:51
Go to the top of the page
+Quote Post
devnul
post 28.03.2007, 10:57:50
Post #6





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

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


rotfl nieźle - użytkownik mniejszy i jednocześnie większy od zero - z całą pewnością zadziała winksmiley.jpg

@terreska: nie napisałem że to rozwiązanie wymaga wsparcia subzapytan ze strony mysql'a a to zostało wprowadzone chyba dopiero w jego 5 wersji (a może 4?) - tak więc jeśli posiadasz wersję 3.xx to z całą pewnością to rozwiązanie nie zadziała - trzeba to rozbić na 2 zapytana

//edit:

można też tak
  1. <?php
  2. $date=mktime (0,0,0,date("m"),date("d"),date("Y"));
  3. $userid=1;
  4. ?>

  1. SELECT `artykuly`.`tekst` FROM `artykuly` JOIN `czytane` ON `artykuly`.`id`!= `artykuly`.tekst_id` WHERE `czytane`.`user`=$userid AND `czytane`.`date`<$date GROUP BY `artykuly`.`id`


Ten post edytował devnul 28.03.2007, 11:07:46


--------------------
Profesjonaliści są przewidywalni...
strzeż się amatorów...
FL4SHB4CK - imprezy, galerie, lokale
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 00:44