[英]How to combine data from 2 tables under circumstances?
我有2張桌子。 一個表包含職位,另一個表包含職位投票。 每個成員都可以為每個帖子投票(+或-)。 (結構示例:)
還有一個包含用戶信息的表。
我想要的是:假設我是登錄會員。 我想顯示所有帖子,在我已經投票的帖子中,不要讓我再次投票。 (並告訴我我已投票+或-)
到目前為止,我所做的事情非常糟糕,因為它將執行很多查詢:
SELECT `posts`.*, `users`.`username`
FROM `posts`,`users`
WHERE `posts`.belongs=$taken_from_url AND `users`.`usernumber`=`posts`.`userp`
ORDER BY `posts`.`pid` DESC;
接着:
foreach ($query as $result) {if (logged_in) {select vote from votes....etc} }
因此,這意味着,如果我登錄,它顯示了30個職位,那么它會做30次的查詢,以檢查是否在每個崗位我投什么,我已經投了票。 我的問題是,我可以用JOIN縮短操作時間嗎? (我已經嘗試過一些東西,但是沒有成功)
首先,我要說的是,如果要為登錄的用戶和未登錄的用戶提供顯着不同的輸出,則只需進行兩個查詢,而不要嘗試創建真正復雜的東西。
其次,這應該做您想要的事情:
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
語法(這又歸結為可讀性)。 然后它具有兩個子查詢:第一個子查詢查找該特定帖子的總票數,第二個查詢特定用戶的投票是什么:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.