Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL]Wypisanie danych na podstawie 2 tabel z bazy danych.
KrzysiekKCN
post
Post #1





Grupa: Zarejestrowani
Postów: 148
Pomógł: 2
Dołączył: 4.08.2009
Skąd: Poznań

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


Witam, tak to znowu ja. Jednak nie proszę o pomoc w zapytaniach, składni czy czymkolwiek oprócz odrobiny logiki.
Tak więc chciał bym wyświetlić listę użytkowników których niema na liście znajomych.

Sytuacja wygląda następująco:

Otwarta sesja $_SESSION['uzyt'] $user = $_SESS~ czyli np. $user = 'Kowalski';

Mam 2 tabele:

USERS:
-------------
|ID |USER |
1 kowalski
2 uzytk1
3 uzytk2
4 uzytk3
5 uzytk4
6 uzytk5
7 uzytk6
8 uzytk7
-------------

FRIENDS
---------------------------------------------------
|ID | ID_ZNAJOMEGO | ID_UZYTKOWNIKA |
---------------------------------------------------
1 2 1
2 5 1
3 7 1
----------------------------------------------------

Tak więc kowalski ma 3 znajomych: uzytk1 uzytk4 i uzytk6, a na liście mają wyświetlić się wszyscy oprócz kowalskiego($user) i jego znajomych. Próbowałem już na wszelkie sposoby, fory, while, IFy.

Czy ktoś dał by mi jakąś wskazówkę? Naprawdę nie wiem na jakiej zasadzie logicznie to wyciągnąć.

Proszę o pomoc, w razie niejasności pisać ^^. Z góry dziękuje.

Ten post edytował KrzysiekKCN 15.06.2011, 21:59:25
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
tehaha
post
Post #2





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


Cytat
na liście mają wyświetlić się wszyscy oprócz kowalskiego($user) i jego znajomych
Jeżeli chcesz pobrać ID wszystkich użytkowników oprócz kowalskiego i jego znajomych, to najpierw pobierasz te ID znajomych przy pobieraniu wrzucasz je do tablicy i potem funkcją
  1. implode(', ', $array)
wstawiasz w takie zapytanie:
  1. FROM users WHERE id NOT IN(1, 2, 5, 7)
Go to the top of the page
+Quote Post
pmir13
post
Post #3





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


  1. SELECT u.* FROM users u
  2. LEFT JOIN ( SELECT f.id_znajomego FROM users u1
  3. JOIN friends f ON f.id_uzytkownika=u1.id
  4. WHERE u1.user='kowalski' ) z
  5. ON z.id_znajomego=u.id
  6. WHERE u.user <> 'kowalski' AND z.id_znajomego IS NULL
Go to the top of the page
+Quote Post
KrzysiekKCN
post
Post #4





Grupa: Zarejestrowani
Postów: 148
Pomógł: 2
Dołączył: 4.08.2009
Skąd: Poznań

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


Hmm implode służy do przemiany tablicy w ciągłe wyrażenie tak?

Czyli nie trzeba go używać jeżeli zastosuje np. takie coś?
  1. $z99 = "select * from `znajomi` where `id_usera`='".$r['id']."' ORDER BY `id`";
  2. $w99 = mysqli_query($mysql, $z99);
  3. while ($r99 = mysqli_fetch_array($w99)) {
  4. $array = $array."'".$r99['id_znajomego']."',";
  5. }


-----------------------------------------------------------------------------------------
pmir13 a czy ty byś mógł objaśnić działanie tego kodu?


Ten post edytował KrzysiekKCN 15.06.2011, 23:20:34
Go to the top of the page
+Quote Post
pmir13
post
Post #5





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


To co jest w nawiasie z aliasem z to jest lista id znajomych kowalskiego, czyli dla przykładowych danych
Kod
id_znajomego
2
5
7

Łączymy tabelę user z tą listą przez LEFT JOIN po pasujących id, otrzymujemy
wszystkie rekordy z user, i pasujące po id rekordy z listy z, przy czym
jeśli nie pasuje żaden id ze znajomych to jest tam NULL, zwykły JOIN (czyli INNER JOIN)
po prostu pominąłby rekordy z NULL.
Czyli bez where i nie ograniczając kolumn w select (select * from...) dostalibyśmy:
Kod
id      user         id_znajomego
1       kowalski     NULL
2       uzytk1       2
3       uzytk2       NULL
4       uzytk3       NULL
5       uzytk4       5
6       uzytk5       NULL
7       uzytk6       7
8       uzytk7       NULL

Teraz pozostaje tylko sprawdzić gdzie jest NULL i pominąć kowalskiego, bo wprawdzie sam sobie
znajomym nie jest, ale nas nie interesuje, to wszystko właśnie jest sprawdzane w WHERE.

Ten post edytował pmir13 16.06.2011, 07:48:22
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 Aktualny czas: 20.08.2025 - 15:49