[英]Select data from a MySQL table where some results from another table depends on a condition, if there are any
我希望通過PHP代碼以特定方式訂購一些MySQL結果。
我有兩個表:
第一個表稱為“ post”,具有以下非詳盡內容:
第二個表稱為“投票”,具有以下非詳盡內容:
如果用戶對現有帖子投票,則在“投票”表中進行記錄,將帖子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
如果我沒記錯的話,這是您要找的東西嗎?
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.