Dodałem odpowiedź na poprzednie pytanie, proszę odnieść się najpierw do tego w celu zrozumienia.
Nie możesz tego uzyskać z bb_ratings
sam, grupując go i hakując. Otrzymujesz wartość Null, ponieważ myślisz w kategoriach siatki, a nie zbiorów relacyjnych (jest to centralna koncepcja modelu relacyjnego).
-
Zanim zdecydujesz, do których tabel się udać, aby obsłużyć zapytanie, musisz zdecydować, co chcesz dla struktury zestawu wyników.
-
Następnie ogranicz go (które wiersze) za pomocą
WHERE
klauzula. -
Następnie zastanów się, skąd (z jakich tabel) pobrać kolumny. Albo dołącza do większej liczby tabel i więcej pracy na
WHERE
klauzula; lub podzapytania skalarne, skorelowane z zapytaniem zewnętrznym.
Nie masz jasności co do tego, czego chcesz. Wygląda na to, że chcesz ten sam raport, co w poprzednim pytaniu, plus kolumnę na głos danego użytkownika. Dla mnie struktura twojego zestawu wyników to lista biuletynów. Cóż, mogę to uzyskać z bulletin
, nie ma potrzeby przechodzenia do bulletin_like
a następnie trzeba to pogrupować.
Jeśli myślisz w kategoriach zestawów, jest to bardzo proste, nie ma potrzeby przeskakiwania przez obręcze z widokami zmaterializowanymi lub zapytaniami „zagnieżdżonymi”:
SELECT name AS bulletin,
(SELECT COUNT(like)
FROM bulletin_like bl
WHERE bl.bulletin_id = b.bulletin_id
AND like = 1
) AS like,
(SELECT COUNT(like)
FROM bulletin_like bl
WHERE bl.bulletin_id = b.bulletin_id
AND like = 0
) AS dislike,
(SELECT COUNT(like)
FROM bulletin_like bl
WHERE bl.bulletin_id = b.bulletin_id
AND bl.user_id = {$user_d}
AND like = 1
) AS your_vote
FROM bulletin b
Odpowiedzi na komentarze
Mam wrażenie, że to, co mówisz, jest bardzo ważne dla tego, jak podchodzę do SQL
-
Tak, absolutnie. Jeśli chcesz nauczyć się właściwych rzeczy z góry, to:
- zaoszczędzę ci później wszelkiego rodzaju problemów
- poprawić wydajność zapytań
- umożliwiają szybsze kodowanie
.
-
Na razie zapomnij o używaniu zestawów wyników jako tabel (znacznie wolniej) i tabel tymczasowych (zdecydowanie nie jest to wymagane, jeśli Twoja baza danych jest znormalizowana). Jesteś dużo lepiej odpytywać tabele bezpośrednio. Musisz nauczyć się różnych przedmiotów, takich jak model relacyjny; jak używać SQL; jak nie używać SQL, aby uniknąć problemów; itd. Chętnie ci pomogę i zostanę z tobą przez jakiś czas, ale muszę wiedzieć, że jesteś chętny. Zajmie to trochę tam iz powrotem. Na tej stronie jest trochę zamieszania, więc zignoruję inne komentarze (do końca) i odpowiem tylko na twoje.
- przestań używać
GROUP BY
, poważnie utrudnia zrozumienie języka SQL. Jeśli nie możesz uzyskać żądanego raportu bez użyciaGROUP BY
, zadaj pytanie.
.
- przestań używać
-
To zamieściło pytanie. Daj mi znać, w którym momencie się zgubiłeś, a od tego momentu podam więcej szczegółów.
- W przypadku tego pytania potrzebna jest lista biuletynów z polubieniami; nie lubi; i to lubi użytkownicy. Czy to jest poprawne ? Czy wypróbowałeś podany przeze mnie kod?
.
- W przypadku tego pytania potrzebna jest lista biuletynów z polubieniami; nie lubi; i to lubi użytkownicy. Czy to jest poprawne ? Czy wypróbowałeś podany przeze mnie kod?
- Przejrzałem pytanie, do którego prowadzi link. Jest bałagan i nikt nie zajął się głębszym problemem; rozwiązali problem na powierzchni, w odosobnieniu. Masz teraz odpowiedź, ale jej nie rozumiesz. To bardzo powolny sposób na postęp.