Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z zapytaniem do bazy
Forum PHP.pl > Forum > Bazy danych > MySQL
moto0095
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
bpskiba
kombinujesz właściwie, ale musisz jeszcze połączyć obie tabele gdyż bez tego tworzy się iloczyn kartezjański.
moto0095
A mógłbyś napisać jak to zrobić ?
bpskiba
  1. SELECT *, IF(id IN (SELECT fav_id FROM ulubione), TRUE, FALSE) AS isFavs FROM posts

... JOIN ulubione on post_id=id
pmir13
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
bpskiba
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 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ę smile.gif
Natomiast obaj wiemy, że taki JOIN musi być
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.