Pomoc w zapytaniu.

0

Czesc, potrzebuje pomocy w budowowie bazy danych, a wlasciwie w zapytaniu. Zapytanie robie dla 3 tabel, a tutaj o to te tabelki
user image

Idac od gory tabelki to posts,recommends,users.
Jaki efekt chce osiagnac? A taki, ze dla kazdgo poszczegolnego usera wyswietli sie lista postow polaczona relacja z tabela users oraz z tabela recommends aby uzyskac kolumny i wiersze z danym postem, jaki user wykonal ten post, czy dany jeser dla ktorego sprawdzamy moze jeszcze rekomendowac dany post oraz ilosc recommendow ile ma ten post.

Takie zapytanie zrobilem z tym ze wyswietla mi sie lista tylko jesli dany user takie posty rekomenduje, a potrzebuje wyswietlic cala liste postow, nawet te ktore nie rekomenduje.
Moje zapytanie wyglada w nastepujacy sposob.


SELECT recommends.topic_id,posts.topic ,users.username,'0' as CANRECOMMEND,COUNT(recommends.topic_id) AS recommendsN
FROM recommends
JOIN posts ON recommends.post_id = posts.id 
JOIN users ON posts.creator = users.id
WHERE posts.idIN(SELECT posts.id FROM recommends JOIN psts ON recommends.post_id = posts.id JOIN users ON posts.creator = users.id WHERE recommends.user_id = jakiesID)
GROUP BY posts.id

Zapytanie dziala pieknie dla tych uzytkownikow ktorzy rekomenduja jakies posty, ale nie tego oczekuje. Poniewaz brakuje calej listy postow wraz z tymi samymi kolumnami co tutaj, z tym wtedy recommendsN bedzie automatycznie ustawione na "1".

0

No bo wychodzisz od tabeli recommends w zapytaniu, więc join-ując posty i users dostajesz tylko te dane, które już dostały recommends. Zastanów się co chcesz uzyskać ? Zakładam, że każdy post z każdym użytkownikiem i flagą can_recommend i ilością recommends, czy tak ?

Pomijając, że będzie to duża ilość danych to będzie słownie coś takiego: Utwórz kartezjana z users i posts i zrób left join recommends (po user_id i topic_id), na podstawie tego czy dla konkretnego user+post masz coś w recommends, ustal flagę can_recommend i ilość recommends.

EDIT: Jeżeli tabela recommends może zawierać wiele rekordów dla tego samego user_id+topic_id, a z tego co widzę to nie masz unique-a, więc może to musisz jeszcze zrobić agregację i grupowanie.

Nie mam pewności czy dobrze zrozumiałem Twój problem, jeżeli nie to podaj więcej szczegółów.

0

Zakładam, że każdy post z każdym użytkownikiem i flagą can_recommend i ilością recommends, czy tak ?
Tak, wlasnie o to mi chodzi. A co do UNIQUE juz wlasnie to zrobilem. Ja do tego mojego zapytania robilem right join z unionem dla wynikow gdzie nie ma tych id badz nie istenieja albo mi nie wyszlo.

Moglbys to jakos przedstawic w formie kodu? bo nie bardzo rozumiem.

0

Coś takiego:

SELECT
  u.*,
  p.*,
  (CASE WHEN r.id IS NULL THEN 0 ELSE 1 END) AS ilosc_recommends
FROM
  users u,
  posts p
LEFT JOIN recommends r ON (r.user_id = u.id AND r.post_id = p.id)

Założyłem, że user_id i post_id są UNIQUE w recommends, wtedy albo masz 1 recommend albo 0, nigdy więcej.
Aha, być może będziesz to musiał do MySQL-a dopracować, napisałem z głowy i to tak jakbym pisał na Oracle-a (na co dzień używam).

EDIT:

To może Ci trochę zamulić bazę danych zwłaszcza jak masz dużo danych, więc ogranicz jakimś WHERE-em.

0

Zapytanie dziala dobrze, ale niestety jesli zrobie klauzule where dla konrketnego uzytkownika to nie dostaje juz wartosci NULL, czyli naszego 0.

0

Ok juz sobie poradzilem dodalem warunek OR.

0

A Co jesli chce policzyc te posty? Bo to jedynie jest 1,0, czyli teoretycznie pokazuje ktore zostaly zaglosowane. ale jak je teraz policzyc?

0

Chcesz policzyć wszystkie, czy zagłosowane w podziale dla user-ów ?

0

chce policzyc wszystkie. aby obok 1 badz 0 pojawila sie prawdziwa liczba zaglosowan ogolem.

0
SELECT
  u.*,
  p.*, 
  (CASE WHEN r.id IS NULL THEN 0 ELSE 1 END) AS ilosc_recommends,
  (SELECT COUNT(*) FROM recommends r1 WHERE r1.post_id = p.id) ilosc_wszystkich
FROM
  users u,
  posts p
LEFT JOIN recommends r ON (r.user_id = u.id AND r.post_id = p.id)

Nie myślę już dziś, ale spróbuj takie coś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0