Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][SQL] Zapytanie dotyczące wyświetlania wpisów na talicy, coś jak Facebook
lukaszk
post
Post #1





Grupa: Zarejestrowani
Postów: 159
Pomógł: 0
Dołączył: 21.12.2010

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


Witam, mam problem z zapytaniem
Mam tabelę tablica do której dodają się id dodanych filmów, galerii itd.
Założenie jest takie aby zapytanie wyświetlało to co użytkownik zaznaczył że ma być na tablicy.
Podstawowe treści, linki do fotek i filmów zawierają tabele filmy i galerie
id_dodany w tabeli tablica zawiera id filmu, galerii którą użytkownik chcę umieścić na tablicy.

mam taki problem - kiedy zapytanie dotyczyło tylko jednej tablicy (dla filmy) wszystko było ok
teraz dodałem tablice galerie i dla filmów dalej jest ok z tym że przy jednym rekordzie w tablicy galerie
wyświetla się tyle razy ile mam filmów czyli jeśli mam 7 filmów to mam i 7 razy ten sam wpis.
Proszę o pomoc jak to rozwiązać bo ja już długo się z tym bawię i nic (IMG:style_emoticons/default/sad.gif)


  1. SELECT *
  2. FROM tablica a JOIN filmy b, galerie c
  3. WHERE a.id_dodany=b.id_film OR a.id_dodany=c.id_galeria ORDER BY id_dodany DESC";
  4.  
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
bostaf
post
Post #2





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


Zakładam, że że jeden użytkownik może mieć tylko i wyłącznie jedną tablicę i jedna tablica może należeć tylko i wyłącznie do jednego użytkownika. I nigdy się to nie zmieni. To ważne bo jeśli jest szansa, że któryś z tych dwóch warunków się zmieni, to warto już teraz przyjąć inną strukturę danych.
Jeśli chodzi o tabele mediów - "galerie", "filmy", itd. to jest OK.
Jeśli chodzi o tablice użytkowników: zamiast przechowywać w jednej tabeli wszystkie informacje o powiązanych mediach, zrób indywidualne tabele dla każdego: "tablice_galerie", "tablice_filmy", itd. W każdej z tych tabel będziesz przechowywał informację o tym, która galeria/film/itd jest przypięta do której tablicy (do którego użytkownika), np.:
Kod
tabela "tablice_galerie"
id_uzytkownik | id_galeria | data_przypiecia | komentarz

W momencie tworzenia nowego wpisu o galerii w tabeli "galerie" musisz utworzyć też wpis w tabeli "tablice_galerie". W ten sposób, domyślnie, autor wpisu o galerii będzie miał przypiętą galerię do swojej tablicy. Galerię istniejąca w systemie będą mogli dodawać do swoich tablic inni uzytkownicy - będziesz dodawał kolejny wpis z takim samym identyfikatorem galerii i identyfikatorem osoby dodającej. W ten sposób pozwolisz odpiąć galerię od tablicy nawet autorowi wpisu o galerii i będziesz miał możliwość pokazywania galerii znajomym znajomych itd.

Jak pokazać galerie znajomych na swojej tablicy? Przeszukując tabelę "znajomi". Z tą tabelą jest taki problem, że nie wiadomo w której kolumnie jest id aktualnie zalogowanego użytkownika. Ale to tylko mała niedogodność, z którą można sobie łatwo poradzić. Czyli, po pierwsze, potrzebujemy id użytkowników, którzy są znajomymi aktualnie zalogowanego użytkownika id X:
Kod
SELECT id_user_2 AS znajomy FROM znajomi WHERE id_user_1 = X
UNION -- "union" elegancko połączy oba zapytania bez duplikatów
SELECT id_user_1 AS znajomy FROM znajomi WHERE id_user_2 = X

W wyniku dostaniesz kolumnę o nazwie "znajomy" wypełnioną identyfikatorami znajomych aktualnie zalogowanego użytkownika. Wyszukanie galerii obecnych na ich tablicach jest czystą formalnościa:
Kod
SELECT id_galeria
FROM tablice_galerie
WHERE id_uzytkownik IN (
    SELECT id_user_2 AS znajomy FROM znajomi WHERE id_user_1 = X
    UNION
    SELECT id_user_1 AS znajomy FROM znajomi WHERE id_user_2 = X
)

W wyniku dostaniesz identyfikatory galerii przypiętych do tablic wszystkich znajomych aktualnego usera. No OK, ale co jeśli niektóre z tych galerii są też przypięte do tablicy aktualnego usera? Nie chcemy ich dwa razy pokazywać, no nie? Do zapytania wyciągającego identyfikatory użytkowników dodajemy id aktualnego usera:
Kod
SELECT id_galeria
FROM tablice_galerie
WHERE id_uzytkownik IN (
    SELECT id_user_2 AS znajomy FROM znajomi WHERE id_user_1 = X
    UNION
    SELECT id_user_1 AS znajomy FROM znajomi WHERE id_user_2 = X
    UNION
    SELECT X
)

No i mamy identyfikatory wszystkich galerii, które aktualny user powinien zobaczyć na swojej tablicy: zarówno tych przypiętych do swojej tablicy jak i tych przypietych do tablic swoich znajomych; bez duplikatów. Do tego wyniku dodamy dane galerii:

Kod
SELECT
    tg.id_galeria,
    g.id_uzytkownik AS id_autora_galerii, -- "autora" w sensie twórcy wpisu o galerii
    g.data_przypiecia,
    g.komentarz AS komentarz_autora_galerii -- "autora" w sensie twórcy wpisu o galerii
FROM tablice_galerie tg
JOIN galerie g ON g.id_galeria = tg.id_galeria
WHERE tg.id_uzytkownik IN (
    SELECT id_user_2 AS znajomy FROM znajomi WHERE id_user_1 = X
    UNION
    SELECT id_user_1 AS znajomy FROM znajomi WHERE id_user_2 = X
    UNION
    SELECT X
)

W wyniku otrzymasz takie zestawienie:
Kod
   id_galeria | id_autora_galerii |     data_przypiecia | komentarz_autora_galerii
  ------------+-------------------+---------------------+--------------------------
           23 |               483 | 2012-03-12 12:12:32 | Fajowa
          287 |                12 | 2012-01-26 06:30:43 | Polecam
           35 |                12 | 2012-01-29 09:45:01 | Polecam też

To są same galerie. Podobnie robisz z filmami i innymi mediami. Poszczególne wyniki ładujesz do tablicy w PHP i tam sortujesz i obrabiasz.
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: 4.10.2025 - 15:23