Во-первых, я скажу, что если вы хотите, чтобы пользователи, вошедшие в систему, значительно различались по сравнению с теми, которые этого не делают, просто сделайте два запроса, а не пытайтесь создать что-то действительно сложное.
Во-вторых, это должно сделать что-то вроде того, что вы хотите:
SELECT p.*, u.username,
(SELECT SUM(vote) FROM votes WHERE postid = p.pid) total_votes,
(SELECT vote FROM votes WHERE postid = p.pid AND userv = $logged_in_user_id) my_vote
FROM posts p
JOIN users u ON p.userp = u.usernumber
WHERE p.belongs = $taken_from_url
ORDER BY p.pid DESC
Примечание: Вы не говорите, каковы значения таблицы голосов. Я предполагаю, что это либо +1 (вверх) или -1 (вниз), так что вы можете легко найти общее количество голосов, сложив их. Если вы делаете это не так, я предлагаю вам сделать это, чтобы облегчить вашу жизнь.
Первый коррелированный подзапрос можно устранить, выполнив JOIN
и GROUP BY
, но я склонен находить приведенную выше форму гораздо более читабельной.
Итак, он присоединяет пользователей к сообщениям, так же, как вы это делали, за исключением того, что он использует синтаксис JOIN
(который снова сводится к удобочитаемости). Затем у него есть два подзапроса: первый находит общее количество голосов за этот конкретный пост, а второй определяет, каким был голос конкретного пользователя:
- + 1: голосование вверх;
- -1: голосование против;
- NULL: нет голосов.