Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie danych z dwóch tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
phpowiec84
mam pewien problem ..

są dwie tabele

1 testy

test_id (int)
user_id (int)

2 share

test_id (int)
user_id (int)
status (int)

chce pobrać wszystkie rekordy z tabeli testy gdzie użytkownik ma w drugej tabeli status różny od 1

nie bardzo wiem jak do tego podejść:/
Hpsi
  1. SELECT `testy`.`test_id`, `testy`.`user_id` FROM `testy`AS `testy` LEFT JOIN `share` AS `share` USING(`user_id`) WHERE `share`.`status`<>1


Pisane z reki mam nadzieje ze dobrze smile.gif
phpowiec84
przepraszam ,w powyższym poście nastąpiła pomyłka , w kolumnie test nie ma tabeli user_id \

1 testy

test_id (int)

2 share

test_id (int)
user_id (int)
status (int)
Hpsi
  1. SELECT `test`.`test_id`, `share`.`user_id` FROM `testy` AS `test` LEFT JOIN `share` AS `share` USING `test_id` WHERE `share`.`status`<>1

Do końca nie wiem czy to wyświetli tak jak potrzeba, jeśli nie to daj znak stworze sobie tabele i chwile pokombinuje. Tylko wtedy napisz dokładnie jaki efekt chcesz użyskać
to ma dzialać na zasadzie grupowania ze do pierwszego testu wyswietli ci wszyskich userow ktorzy wykonali ten test?
phpowiec84
dzięki ,działa świetnie smile.gif

a co jeśli druga tabela nie zawiera rekordów pasujących do :

test.test_id = share.test_id ?
Rochu
wtedy takie pole bedzie mialo wartosc NULL, czyli bedzie po prostu puste
phpowiec84
ale mi zależy aby pobrać wszystkie testy w których użytkownik nie brał udziału,a powyższe pytania zwraca mi wszystkie w których brał udział :/
Hpsi
Jak masz oznaczone w bazie czy user brał czy nie brał w danym teście udział? po prostu wpis czy jak?
phpowiec84
mam wpis jeżeli brał udział w teście ,dodatkowo share.status podaje czy test został przyjęty , czy odzucony

więc chcę aby wynikiem zapytania było :

czy user brał udział w teście , jeśli tak to pobrać również testy gdy share.status <> 1
Hpsi
Czyli jesli dobrze zrozumiałem:

Twoje zapytanie ma działać na zasadzie:

do danego użytkownika pobiera wszystkie testy, sprawdza czy share.status<>1 (jeśli jest wpis) i te ma pokazywać?
Czy ma pobierać wszystkich uzytkowników + wpis o testach w jakim brali udział ?
phpowiec84
może inaczej ,niech pobiera wszystkie testy w których użytkownik nie brał udziału (pomińmy kolumnę share.status)
Hpsi
pokombinuje torkszę jak to zrobić - daj mi chiwle wink.gif jesli sie uda dam rozwiazanie.

Sprawdź czy o to Ci chodziło:

Stworzłem 2 tabele:
Kod
mysql> select * from share;
+---------+---------+--------+
| test_id | user_id | status |
+---------+---------+--------+
|       1 |       1 |      1 |
|       2 |       1 |      0 |
+---------+---------+--------+

Oraz
mysql> select * from testy;
+---------+
| test_id |
+---------+
|       1 |
|       2 |
|       3 |
+---------+


Wynik zapytania:
  1. SELECT `test_id` FROM `testy` WHERE `test_id` NOT IN (SELECT `test_id` FROM `share` WHERE `user_id`=1 AND `status`=1);

jest następujacy:
Kod
mysql> select `test_id` FROM `testy` WHERE `test_id` NOT IN (select `test_id` FROM `share`  WHERE `user_id`=1 AND `status`=1);
+---------+
| test_id |
+---------+
|       2 |
|       3 |
+---------+
2 rows in set (0,00 sec)


To ci pokaze wszystkie testy w ktorych status nie jest 1 dla uzytkownika o id 1
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.