Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z zapytaniem do bazy
moto0095
post
Post #1





Grupa: Zarejestrowani
Postów: 247
Pomógł: 9
Dołączył: 12.03.2010

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


Witam, mam problem z zapytaniem do bazy danych, a więc, mam dwie tabele

ulubione :
post_id | user_id

posts
id | title | body | created

i chciałem ułożyć zapytanie takie aby mi zwracało zmienną np "isFavs" (true/false) jeśli id postu jest w ulubionych, probowalem tak, ale to nie dział:
  1. SELECT *, IF(id IN (SELECT fav_id FROM ulubione), TRUE, FALSE) AS isFavs FROM posts


Ten post edytował moto0095 12.06.2013, 17:50:15
Go to the top of the page
+Quote Post
bpskiba
post
Post #2





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

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


kombinujesz właściwie, ale musisz jeszcze połączyć obie tabele gdyż bez tego tworzy się iloczyn kartezjański.
Go to the top of the page
+Quote Post
moto0095
post
Post #3





Grupa: Zarejestrowani
Postów: 247
Pomógł: 9
Dołączył: 12.03.2010

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


A mógłbyś napisać jak to zrobić ?
Go to the top of the page
+Quote Post
bpskiba
post
Post #4





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

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


  1. SELECT *, IF(id IN (SELECT fav_id FROM ulubione), TRUE, FALSE) AS isFavs FROM posts

... JOIN ulubione on post_id=id
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%)
-----


Jeśli użyjemy takiego joina to właściwie cały ten IF możemy zastąpić SELECT 1 AS isFavs, zapewnia to sam warunek złączenia, a nie przypuszczam by o to autorowi chodziło.
W ogóle ciężko stwierdzić o co chodziło, bo jesteśmy przygniecieni ogromem informacji zawartych w stwierdzeniu "ale to nie dział".
Prawidłową odpowiedzią na najbardziej prawdopodobny scenariusz czyli autorowi chodziło o to, by wyświetlić wszystkie posty oraz informację czy dany post znajduje się w czyichkolwiek ulubionych byłoby poprawienie oczywistego błędu składniowego - zamiana fav_id na post_id, bo pola fav_id nie ma w strukturze tabel. Obawiam się jednak, że nadal możemy otrzymać odpowiedź "wciąż nie dział".
Jeśli jednak o to właśnie chodzi, a mamy użyć do tego joina, zamiast całkiem wolnego IN( ), to lepiej byłoby:

  1. SELECT DISTINCT posts.* , ulubione.post_id IS NOT NULL AS isFavs
  2. FROM posts LEFT JOIN ulubione ON posts.id = ulubione.post_id


Ten post edytował pmir13 13.06.2013, 19:47:57
Go to the top of the page
+Quote Post
bpskiba
post
Post #6





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

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


Cytat(pmir13 @ 13.06.2013, 20:46:19 ) *
Jeśli użyjemy takiego joina to właściwie cały ten IF możemy zastąpić SELECT 1 AS isFavs, zapewnia to sam warunek złączenia, a nie przypuszczam by o to autorowi chodziło.
W ogóle ciężko stwierdzić o co chodziło, bo jesteśmy przygniecieni ogromem informacji zawartych w stwierdzeniu "ale to nie dział".
Prawidłową odpowiedzią na najbardziej prawdopodobny scenariusz czyli autorowi chodziło o to, by wyświetlić wszystkie posty oraz informację czy dany post znajduje się w czyichkolwiek ulubionych byłoby poprawienie oczywistego błędu składniowego - zamiana fav_id na post_id, bo pola fav_id nie ma w strukturze tabel. Obawiam się jednak, że nadal możemy otrzymać odpowiedź "wciąż nie dział".
Jeśli jednak o to właśnie chodzi, a mamy użyć do tego joina, zamiast całkiem wolnego IN( ), to lepiej byłoby:

  1. SELECT DISTINCT posts.* , ulubione.post_id IS NOT NULL AS isFavs
  2. FROM posts LEFT JOIN ulubione ON posts.id = ulubione.post_id

Nie psuj zabawy (IMG:style_emoticons/default/biggrin.gif) człowiek pracuje i kombinuje.... Większość pytających oczekuje gotowego rozwiązania, a tylko kilku pracuje, kombinuje i na końcu dochodzi do wniosku, że rozwiązanie jest banalnie proste. Daj szansę (IMG:style_emoticons/default/smile.gif)
Natomiast obaj wiemy, że taki JOIN musi być

Ten post edytował bpskiba 13.06.2013, 20:36:47
Go to the top of the page
+Quote Post

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: 31.08.2025 - 20:15