簡體   English   中英

從MySQL表中選擇數據,其中來自另一個表的某些結果取決於條件(如果有)

[英]Select data from a MySQL table where some results from another table depends on a condition, if there are any

我希望通過PHP代碼以特定方式訂購一些MySQL結果。

我有兩個表:

第一個表稱為“ post”,具有以下非詳盡內容:

  • ID
  • 發布日期
  • 發布日期
  • ...

第二個表稱為“投票”,具有以下非詳盡內容:

  • ID
  • post_id
  • 用戶身份
  • 狀態

如果用戶對現有帖子投票,則在“投票”表中進行記錄,將帖子ID作為post_id插入,將用戶ID作為user_id插入。 狀態為1表示贊成,2表示反對。

但是要記住一件事: 有些帖子可能根本不會獲得任何投票,例如,第二張表中出現0個!

因此,現在在我的第一頁上,我通過以下方式對帖子及其投票數(upvotes-downvotes)進行排序,並且效果很好

$post_req = mysql_query('SELECT * FROM post
WHERE NOW() > released_date
ORDER BY ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) DESC, published_date DESC
LIMIT 0, 5');

但是在下一頁(即新的迭代)上,我需要從票數上繼續我離開的地方。 在執行此操作之前,我將第一頁的最后一個帖子的票數保存到變量$ last_post_votes下,以將其傳遞給下一個。

現在,這是我的難題:在新的請求中,我需要查找投票數量低於此變量的帖子。 如下,我失敗的嘗試:

$post_req_1 = mysql_query('SELECT * FROM post
WHERE NOW() > released_date
AND ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) < "'.$last_post_votes.'"
ORDER BY ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) DESC, published_date DESC
LIMIT 5');

然后我嘗試了類似的方法,但也失敗了:

$post_req_1 = mysql_query('SELECT post.*,
((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.poste_id = post.id AND votes.status = 2)) AS all_votes
FROM post, votes
WHERE NOW() > post.released_date
AND all_votes < "'.$last_post_votes.'"
ORDER BY all_votes DESC, post.published_date DESC
LIMIT 5');

問題顯然是在SELECT中從另一個表搜索結果時的條件。

任何幫助是極大的贊賞!

在此先多謝! :-)

路易

編輯

通過在ORDER BY本身中直接使用條件,我設法使其按預期工作。 不確定它是否超級合適,但它似乎可以工作:

$post_req_1 = mysql_query('SELECT * FROM post
WHERE NOW() > released_date
ORDER BY ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) < "'.$last_post_votes_passed.'" DESC, published_date DESC
LIMIT 5');

如果您的第一句話很好用,為什么不繼續呢?

LIMIT 0,5的LIMIT子句開始,它為您提供結果集的前5條記錄。 如果將第一個參數增加到LIMIt,它將顯示接下來的5條記錄,依此類推。 無需擺弄臨時變量...

// first page
SELECT ... LIMIT 0,5

// seond page
SELECT ... LIMIT 5,5

// 10th page
SELECT ... LIMIT 45,5

另請參見http://dev.mysql.com/doc/refman/5.0/en/select.html

如果我沒記錯的話,這是您要找的東西嗎?

SELECT p.id, IFNULL(COUNT(v.id), 0) - IFNULL(COUNT(v2.id), 0) AS `Votes`
FROM
posts p 
LEFT JOIN votes v on v.post_id = p.id AND v.status = 1
LEFT JOIN votes v2 on v2.post_id = p.id and v.status = 2
WHERE NOW() > p.released_date
ORDER BY `Votes` DESC;

暫無
暫無

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

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