2012-10-13 166 views
0

希望我能得到一些幫助解決這個問題。我有三個表格,一個有稱爲op_ideas的帖子(想法)。我有另一個名爲op_idea_votes的表。這些可以通過idea_id鏈接。mySQL查詢計數,選擇​​三個表

當一個想法發佈時,民間可以對這個想法進行投票。 op_idea_votes然後更新與最新的投票。

然後我有另一個名爲op_organs的表,根據發佈的用戶類型不同,該表可能也可能不是空的。所以這個表通過POST_TYPE(這是op_organs表的id)鏈接到op_organs.organ_id。

我需要選擇所有這些表來創建一個包含所有要顯示的信息的行,這些信息需要通過idea_id和post_type鏈接。但是我還需要在op_idea_vote表的3列上進行COUNT(同意,不同意,棄權)。

我已經厭倦了UNION,用SUM(CASE選擇,但我不能得到預期的影響。LEFT和INNER JOIN的,但我似乎得到的東西錯了,因爲部分或全部信息的丟失。

的應用程序是在JavaScript和PHP,所以我試圖減少調用數據庫和PHP文件(與Ajax)在哪裏查詢的數量,這就是爲什麼我試圖做到這一點。如果有的話。更好的辦法,我所有的耳朵

這是從工具創建的當前的嘗試,但它回來了空,但沒有錯誤:

SELECT 
op_ideas.author_id, 
op_ideas.date, 
op_ideas.deptid, 
op_ideas.idea_geo, 
op_ideas.idea_id, 
op_ideas.idea_text, 
op_ideas.idea_title, 
op_ideas.modifed_date, 
op_ideas.post_type, 
op_ideas.user_country, 
op_ideas.user_county, 
op_ideas.user_loc, 
op_organs.organ_name, 
op_organs.organ_logo, 
op_organs.active, 
COUNT(op_idea_vote.agree), 
COUNT(op_idea_vote.disagree), 
COUNT(op_idea_vote.obstain) 
FROM 
heroku_056eb661631f253.op_ideas op_ideas, 
heroku_056eb661631f253.op_organs op_organs, 
heroku_056eb661631f253.op_idea_vote op_idea_vote 
WHERE 
op_ideas.idea_id = op_idea_vote.idea_id AND 
op_ideas.post_type = op_organs.organs_id 

所以數據看起來像這樣:

+ ---------------------------------- -------------------------------------------------- -------------------------------------------- +
| idea_id | author_id | idea_title | idea_text |日期|同意|不同意|棄權| organ_name | organ_logo
+ ---------------------------------------------- -------------------------------------------------- -------------------------------- +
| 00001 | 10025225 | teste title |文字在這裏| 2012 | 00005 | 0000004 | 000002 | Comp Name | image/.png
+ ------------------------------------------- -------------------------------------------------- ----------------------------------- +

不是一個很好的例子。但我試過了。

這是最新的代碼。它帶回了3行,即使op_organs爲空。但它沒有顯示票數:

SELECT i.*, o.organ_name, o.organ_logo 
    FROM heroku_056eb661631f253.op_ideas i 
    LEFT JOIN op_organs o ON i.post_type = o.organs_id 
    JOIN 
    (SELECT 
     COUNT(v.agree = 1 or null) as agree, 
     COUNT(v.disagree = 1 or null) as disagree, 
     COUNT(v.obstain = 1 or null) as abstain 
     FROM op_idea_vote v, op_ideas i 
     GROUP BY v.idea_id 
    ) as votes; 

花了一整天的時間,讀了這麼多,我的頭在旋轉。有人有主意嗎 ?

感謝

+0

目前尚不清楚你想要什麼輸出。也許一些示例數據和期望的輸出會有所幫助? – eggyal

+0

我需要一個包含上述字段的行。但請注意,op_organs可能爲空,我需要根據op_ideas中的每條記錄來計算op_idea_vote中的字段。我將編輯頂部並嘗試並可視化它。 –

+0

當你使用計數,選擇​​將總是1行。所以你應該嘗試將所有數據選擇到一行中,參見GROUP_CONCAT – Zaffy

回答

0
SELECT 
    op_ideas.author_id, 
    op_ideas.date, 
    op_ideas.deptid, 
    op_ideas.idea_geo, 
    op_ideas.idea_id, 
    op_ideas.idea_text, 
    op_ideas.idea_title, 
    op_ideas.modifed_date, 
    op_ideas.post_type, 
    op_ideas.user_country, 
    op_ideas.user_county, 
    op_ideas.user_loc, 
    op_organs.organ_name, 
    op_organs.organ_logo, 
    op_organs.active, 
    COUNT(op_idea_vote.agree = 1 or null) as agrees, 
    COUNT(op_idea_vote.disagree = 1 or null) as disagrees, 
    COUNT(op_idea_vote.obstain = 1 or null) as absteins 
FROM 
    heroku_056eb661631f253.op_ideas op_ideas, 
    left join 
    heroku_056eb661631f253.op_organs op_organs on op_ideas.post_type = op_organs.organs_id, 
    inner join 
    heroku_056eb661631f253.op_idea_vote op_idea_vote on op_ideas.idea_id = op_idea_vote.idea_id 
group by 
    op_ideas.author_id, 
    op_ideas.date, 
    op_ideas.deptid, 
    op_ideas.idea_geo, 
    op_ideas.idea_id, 
    op_ideas.idea_text, 
    op_ideas.idea_title, 
    op_ideas.modifed_date, 
    op_ideas.post_type, 
    op_ideas.user_country, 
    op_ideas.user_county, 
    op_ideas.user_loc, 
    op_organs.organ_name, 
    op_organs.organ_logo, 
    op_organs.active 
+0

我不知道可以將布爾運算符這樣短路(儘管它沒有記錄,所以也許不可靠?)。我通常在MySQL中使用'SUM(condition)'或在別處使用'SUM(CASE WHEN condition THEN 1 ELSE 0)'。 – eggyal

+0

@Colodaldo謝謝,我沒有得到任何錯誤,但我沒有結果,我應該有三個? –

+0

@eggyal我將它改爲SUM(CASE: 'SUM(CASE WHEN op_idea_vote.agree THEN 1 ELSE 0 END)as同意, SUM(CASE WHEN op_idea_vote.disagree THEN 1 ELSE 0 END)不一致, SUM(CASE然後當1 ELSE 0 END op_idea_vote.obstain)作爲obstain' 但依然沒有結果? –