MySQL wyswietlenie wszystkich postów z kategorii

0

Czesc próbuje za pomocą sql wyswietlic wszystkie posty ktore są w kategorii i mam tak:
tabela post:
id, apikey,title,tresc
tabela categoryPost
id, apikey, categoryID
tabela category
id nazwa kategorii

i na przyklad jak jeden post ma kilka kategorii to kilkukrotnie jest dodawany do tej samej tabeli tylko z innym numerem kategorii, problem polega na tym ze mam taki sql: i wyswietla on mi wszystkie posty a nie te ktore sa w tabeli kategori SELECT DISTINCT p.*
FROM Post p
INNER JOIN categoryPost cp
ON
cp.apikey = 59595(nr api) AND (cp.categoryID = 1 OR cp.categoryID = 2 OR cp.categoryID = 3 )

0

Bo w warunku złączenia nie masz połączenia między post a categoryPost, czyli zwróci wszystkie posty bo każdy rekord pasuje do siebie, czyli masz cross joina...

zakładając, że apikey wyróżnia post, to zapytanie powinno być takie:

SELECT DISTINCT
    P.*
FROM
    Post p
    INNER JOIN categoryPost cp ON p.apikey=cp.apikey
WHERE
    cp.categoryID in (1,2,3)
0

tylko ze w p mam api uzytkownika ktory dodal post, a tu mi zalezy zeby uzytkownikowi wyswietlac posty ktore kategorie wybral jako "ulubione"

0

jak nie ma? baza danych categoryPost zapisuje apikey uzytkownika + id kategorii, napisalem wyraźnie w pierwszym poście,

0

Kolego Wielki Szczur nic wyraźnie w pierwszym poście nie napisałeś, pokazałeś tylko jakie masz tabele nie opisując co jest co, ani jak się ze sobą łączą, dodatkowo zapytanie które wstawiłeś korzysta tylko z dwóch. W tabeli posts nie widzę pola które by przypisywało post do kategorii...

Ale szklanej kuli nie mam..

Strzelam ostatni raz, bo to strasznie męczące wydobywać informacje od osoby która oczekuje pomocy. Musisz zrozumieć, że masz tak opisać dane, żeby można je było zrozumieć.

SELECT DISTINCT
    P.*
FROM
    Post p
    INNER JOIN categoryPost cp ON p.categoryid=cp.categoryid and cp.apikey = 59595 and cp.categoryID IN (1,2,3)
0

jest tak:
tabela posts, id postu(1,2,3 nr porzadkowy, apikey - uzytkownika ktory dodal, tytul, opis)
tabela category - id (1,2,3,4 nr porzadkowy) i nazwa kategorii
categoryPosts - id (nr porzadkowy 1,2,3,4,5,6) apikey (uzytkownika do ktorego maja byc wyswietlone posty) i nr kategori

0

to teraz mi powiedz skąd mam wiedzieć w jakiej kategori jest post bazując tylko na tabeli posts?
Jak rozumiem z opisu categoryPosts przechowuje informacje o tym z jakiej katogori (categoryID) użtkownik(apikey) chce przeglądać posty?

0

tak, categoryposts przechowuje jaki uzytkownik jakie kategorie ma, czy jak to lepiej zrobic?

0

Nie odpowiedziałeś na pierwsze pytanie.

Skoro kategorie, które chcesz wyświetlić masz w categoryposts to po co w ogóle masz je filtrowane w warunku złączenia ON?

0

nie wiedzialem wlasnie jak to rozwiązać, wysylam apikey i chce dostac wszystkie posty ktore pasuja do kategorii uzytkownika

0

Ponawiam pytanie:
skąd mam wiedzieć w jakiej kategori jest post bazując tylko na tabeli posts?

0

Po raz kolejny odpowiadam że w tabeli cateforyPost jest api użytkownika i nr kategorii,

0

Ciągle się nie rozumiemy. Kilka postow wcześniej napisałeś ze categoryposts przechowuje kategorie jakie użytkownik chce przeglądać. To zmienię pytanie: Opisz jak z tabeli posts wyciągnąć rekordy z kategori 1?

0

Ciężko się z Tobą gada. Wrzuć przykłądowe dane np. na sqlfiddle.com, żeby była jasność. Zacytuję Ciebie:

tabela post:
id, apikey,title,tresc
tabela categoryPost
id, apikey, categoryID
tabela category
id nazwa kategorii

Tabela użytkownicy, której nie dodałeś:
id, apikey, imie
1, api1, Andrzej
2, api2, Maciej

post:
id, apikey,title,tresc
1, api1, tytuł 1 posta, tresc pierwszego posta
2, api2, tytuł Posta Macieja, jego tresc
3, api1, drugi post Andrzeja, tresc

category
id, nazwa kategorii
1, kategoria 1
2, kategoria 2
3, Trzecia kategoria

categoryPost
id, apikey, categoryID
1, api1, 1
2, api2, 3
3, api1, 3
4, api2, 2
5, api1, 2

A teraz zadam pytanie w imieniu swoim oraz @Panczo:
Skąd wiadomo, który rekord z tabeli categoryPost jest do którego POSTA, nie użytkownika.

0

oki, rozumiem swoj blad.
tabela uzytkownicy
id,api,login
tabela post
id, api, title,description
tabela categoryPost
id, postID, categoryID
tabela categoryUsers
id, api, postID, categoryid
tabela category
id, nazwa kategorii

i teraz zrobilem takie zapytanie

SELECT DISTINCT
    p.*
FROM
    Post p
    INNER JOIN categoryPost cp ON p.id=cp.postID 
    INNER JOIN categoryUsers cU ON cU.api = 12345 ANd cU.categoryID = cA.categoryID
     

i niby jest oki, bo wyswietlane sa wszystkie posty ktore sa w categorypost i categoryusers ale wyswietlane dla wszystkich uzytkownikow, ktorzy spelniaja te wymagania, a po api

0

błędnie masz joina nie masz w zapytaniu tabeli/aliasu CA

SELECT DISTINCT
    p.*
FROM
    Post p
    INNER JOIN categoryPost cp ON p.id=cp.postID 
    INNER JOIN categoryUsers cU ON cU.categoryID = cp.categoryID
WHERE
    cU.api = 12345
0

literowka jak przepisywalem tutaj, ale korzystam z mysqlworkbench wiec gdyby nie znalazl tabeli by pokazal blad, wciaz wyswietla mi wszystkie posty a nie te po api

0

Kręcimy sie w kółko:

Wielki Szczur123 napisał(a):

tabela uzytkownicy
id,api,login
tabela post
id, api, title,description
tabela categoryPost
id, postID, categoryID
tabela categoryUsers
id, api, postID, categoryid
tabela category
id, nazwa kategorii

Po co w tabeli categoryUsers kolumna postID?

I teraz załóżmy że mamy dane:

tabela post

id api title description
1 1234 tytul1 opis1
2 1234 tytul2 opis2
3 1234 tytul3 opis3
4 1234 tytul4 opis4
5 1234 tytul5 opis5

tabela categoryPost

id postID categoryID
1 1 1
2 1 2
3 2 3
4 3 4
5 4 1
6 4 5
7 5 5

tabela categoryUsers

id api categoryid
1 12345 1
2 12345 2
3 12345 3

Czyli dla apiuser 12345 powinien zwrócić posty: 1,2,4 bo one są w kategoriach 1,2,3

Zapytanie:

SELECT DISTINCT
    p.*
FROM
    Post p
    INNER JOIN categoryPost cp ON p.id=cp.postID 
    INNER JOIN categoryUsers cU ON cU.categoryID = cp.categoryID
WHERE
    cU.api = 12345

Zwraca:

Wynik

id api title description
1 1234 tytul1 opis1
2 1234 tytul2 opis2
4 1234 tytul4 opis4

Czyli zgodnie z oczekiwaniami. Jaśniej nie potrafię, jeżeli masz jakies uwagi
To proszę na sqlfiddle: http://sqlfiddle.com#!9/54966c/1/0

0

no tak, wszystkie tabele sie zgadzaja i to dziala gdy sa posty tylko jednego uzytkownika, a gdy mam dwoch to wyswietla wszystkie posty a nie po api

0

ps. zwroc uwage nawet na tej stronie, categoryusers dla api 12345 wyswietla 3 wyniki, ale gdy w dwoch wierszach zmienie nr api

 INSERT INTO categoryUsers
    (`id`, `api`, `categoryid`)
VALUES
    (1, 12345, 1),
    (2, 1234, 2),
    (3, 1234, 3)
;

to dla api 12345 powinno wyswietlic tylko jeden wynik to wyswietla dwa

0

Zmieniłem dane i nadal jest poprawnie: http://sqlfiddle.com#!9/32941c/1

Jeżeli nadal jest nie tak, to zmien dane w tym fiddle i pokaż o co chodzi..

0

Dodaj na końcu (na końcu JOIN lub WHERE) : AND cu.api=p.api

0
W napisał(a):

ps. zwroc uwage nawet na tej stronie, categoryusers dla api 12345 wyswietla 3 wyniki, ale gdy w dwoch wierszach zmienie nr api

 INSERT INTO categoryUsers
    (`id`, `api`, `categoryid`)
VALUES
    (1, 12345, 1),
    (2, 1234, 2),
    (3, 1234, 3)
;

to dla api 12345 powinno wyswietlic tylko jeden wynik to wyswietla dwa

No nie do końca dla api 12345 ma wyświetlić posty z kategorii 1, to zwróć uwagę na wiersze o id: 1,5 z tabeli categorypost, wyraźnie wskazuje, że post 1,4 jest w tej kategorii... Czyli jednak 2 nie 1

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