2011-07-30 74 views
0

林很新的SQL,我試圖構造查詢:MySQL的右外連接

$result = mysql_query("SELECT COUNT(*) AS s_count FROM solution RIGHT OUTER JOIN 
ON offer.oid = solution.oid ". "WHERE offer.is_solved = 0 ORDER BY offer.creation_time 
DESC LIMIT $interval_begin, $interval_end"); 

查詢應該是像environnment一個店liveticker:它需要數着沒去過的所有優惠解決,然後列出它們一定的時間間隔以反映列表的某個頁面。 例如,如果每個年齡有25個優惠,則第2頁將是26-50。

任何人都可以發現爲什麼輸出爲0嗎?所有的列/表都存在,並且其中有測試值。

回答

1

不應該查詢像

mysql_query("SELECT COUNT(*) AS s_count FROM solution RIGHT OUTER JOIN offer ON offer.oid = solution.oid WHERE offer.is_solved = 0 ORDER BY offer.creation_time DESC LIMIT".$interval_begin.",".$interval_end); 
+0

拉胡爾:謝謝,這可能是問題的一部分。但是,它仍然返回0 – mldev

+0

然後,我們需要更多關於數據庫表的詳細信息。 – scessor

+0

這兩個表共享一個名爲「oid」的介質int,「offer」中有3000個測試條目,但「解決方案」中有0個測試條目。 我們的目標是將每個「報價」解決方案的數量與「報價」本身結合起來。 – mldev

0

尋找到你的問題和您的查詢,我覺得最明顯的原因(S)爲什麼你總是查詢返回0可能是:

  1. 對於其任何記錄,表offer沒有is_solved = 0。因此,WHERE條件offer.is_solved = 0沒有匹配的條目。您能否爲您的數據證實這一點?

  2. offer沒有數據,因此RIGHT JOIN不會產生任何結果。但正如你在拉胡爾的回答中提到的一個評論,在offer有3000條目,我猜這個原因是不太可能的。

啊哈,有可能是另一個原因也:你確定的限制和偏移,由$interval_begin$interval_end標記設置是否正確?也許,如果它們都設置爲0,那麼查詢將始終返回0.您可以嘗試執行查詢的「回顯/打印」並查看它究竟看起來如何?

因爲我不瞭解您的模式,所以這只是一個建議,我認爲如果您有offer.is_solved列,則不需要與solution的RIGHT JOIN。以下查詢應該工作得很好,不是嗎?

SELECT COUNT(*) AS `s_count` 
FROM `offer` 
WHERE `offer`.`is_solved` = 0 
ORDER BY `offer`.`creation_time` 
DESC LIMIT $interval_begin, $interval_end; 

希望它有幫助!

0

你需要什麼解決方案表中的查詢?從您的文本看起來像

mysql_query("SELECT COUNT(*) FROM offer offer WHERE offer.is_solved = 0 ORDER BY offer.creation_time DESC LIMIT".$interval_begin.",".$interval_end); 

就足夠了。

「我們需要知道的是每個」offer「的解決方案的確切數量,而不僅僅是是否有任何解決方案。」 - 在這種情況下,您的初始SQL是錯誤的,它只是計數訂單。你需要像

mysql_query("SELECT offer.oid, COUNT(solution.oid) FROM offer offer LEFT JOIN ON offer.oid = solution.oid WHERE offer.is_solved = 0 GROUP BY offer.oid ORDER BY offer.creation_time DESC LIMIT".$interval_begin.",".$interval_end);