簡體   English   中英

在情況下如何合並2個表中的數據?

[英]How to combine data from 2 tables under circumstances?

我有2張桌子。 一個表包含職位,另一個表包含職位投票。 每個成員都可以為每個帖子投票(+或-)。 (結構示例:)

  • 帖子表:PID,所屬userp,文本。
  • 投票表:vid,userv,postid,vote。

還有一個包含用戶信息的表。

我想要的是:假設我是登錄會員。 我想顯示所有帖子,在我已經投票的帖子中,不要讓我再次投票。 (並告訴我我已投票+或-)

到目前為止,我所做的事情非常糟糕,因為它將執行很多查詢:

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(向下),因此您可以通過將它們相加輕松找到總票數。 如果您不這樣做,我建議您這樣做可以使您的生活更輕松。

可以通過執行JOINGROUP BY來消除第一個相關子查詢,但是我傾向於發現上述形式更具可讀性。

因此,它的作用是將用戶加入帖子,就像您在做的一樣,只不過它使用JOIN語法(這又歸結為可讀性)。 然后它具有兩個子查詢:第一個子查詢查找該特定帖子的總票數,第二個查詢特定用戶的投票是什么:

  • +1:向上投票;
  • -1:否決;
  • NULL:不投票。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM