2012-01-21 33 views
1

我有3個表:問題類別,併爲problem_categories數查詢停止正常工作,我加入後where子句

我想獲得和計數與問題相關的所有類別的連接表,數每個問題有多少問題。

這裏是我的查詢不返回正確的結果:

SELECT 
    category_name , 
    categories.category_id , 
    problems.problem_id, 
    COUNT(problems.problem_id) as num_problems 
FROM 
    problem_categories 
left JOIN 
    categories 
on 
    problem_categories.category_id = categories.category_id 
left join 
    problems 
on 
    problem_categories.problem_id = problems.problem_id 
WHERE 
    problem_categories.problem_id = 266 
GROUP BY 
    problems.problem_id , category_name 

,但只要我拿出WHERE子句,它返回所有類別和問題的正確計數。但訣竅是,我需要查詢一個特定的問題_id

任何方式來調整這個查詢來得到它的權利?我在這裏做錯了什麼?

謝謝!

+0

我想你需要使用USING()函數 – Chibuzo

+0

@Chibuzo如何以及​​在哪裏? :)我以前沒有真正使用它。 – GeekedOut

+1

嘗試將條件移入'having'子句(在'group by後面):移除'where',並在末尾添加'proble.problem_id = 266'。 – dasblinkenlight

回答

1

你的問題是有些不清楚。如果您選擇特定的問題,您如何計算問題?如果你想指望你做這個特定問題相關的類別(我假設你有外鍵,並在problem_categories表中沒有重複):

SELECT problem_id, COUNT(category_id) as num_categories 
FROM problem_categories 
WHERE problem_id = 266 
GROUP BY problem_id 

然後再加入到問題表,如果你需要打印出更問題信息(爲了提高效率,最後總是得到詳細信息)。如果你是想算的問題 - >類別 - >問題,那麼這樣做:

select p1.problem_id, (COUNT(DISTINCT(p2.problem_id)) - 1) as num_problems 
FROM 
(select problem_id, category_id FROM problem_categories where problem_id = 266) as p1 
inner join 
(select problem_id, category_id FROM problem_categories) as p2 
ON p1.category_id = p2.category_id 
GROUP by p1.problem_id 

同樣,如果你想顯示問題的詳細信息,請加入到這個問題表,讓他們。如果您希望在加入問題表之前將num_problems和num_categories一起加入到第二個查詢中,以獲取問題詳細信息。即:

SELECT p1.problem_id, p1.num_categories, p2.num_problems 
FROM 
(SELECT problem_id, COUNT(category_id) as num_categories 
FROM problem_categories 
WHERE problem_id = 266 
GROUP BY problem_id) as p1 
INNER JOIN 
(SELECT p1.problem_id, (COUNT(DISTINCT(p2.problem_id)) - 1) as num_problems 
FROM 
(SELECT problem_id, category_id FROM problem_categories where problem_id = 266) as p1 
INNER JOIN 
(SELECT problem_id, category_id FROM problem_categories) as p2 
ON p1.category_id = p2.category_id 
GROUP by p1.problem_id) as p2 
ON p1.problem_id = p2.problem_id 
+0

完全令人困惑:)我粘貼你的第二個查詢,它返回有關ON p1.category = p2.category行的錯誤。 – GeekedOut

+0

如果我的原始問題很混亂,我認爲這是一個重新措辭:我試圖找出哪些類別與該問題相關聯,以及總共有多少個問題與這些類別相關聯。完全像標籤功能在頁面的右上方堆棧溢出:) – GeekedOut

+0

我修正了錯字(我有category而不是category_id)。 – Gareth

1
SELECT p1.problem_id, problem_categories.category_id , category_name , 
    COUNT(*) as num_problems 
FROM problems p1 
LEFT JOIN problem_categories on 
    p1.problem_id = problem_categories.problem_id 
LEFT JOIN categories on 
    problem_categories.category_id = categories.category_id 
LEFT JOIN problems p2 ON 
    p2.problem_id = problem_categories.problem_id 
WHERE p1.problem_id = 266 
GROUP BY categories.category_id,p2.problem_id 
ORDER BY categories.category_id 

完蛋了

+0

不,我仍然沒有工作,並給出了錯誤的結果:) – GeekedOut

+0

似乎我們需要從您使用的數據更多的細節.. – rauschen

+0

更新到stackoverflow版本;) – rauschen

1

我認爲有以下應該工作:

SELECT category_name , categories.category_id, COUNT(*) as num_problems 
FROM problem_categories src JOIN CATEGORIES ON src.category_id = categories.category_id 
    JOIN problem_categories dest ON categories.category_id = dest.category_id 
WHERE problems.problem_id = 266 
GROUP BY categories.category_id 

你在做什麼是你想要你查查類別的ID,並從那裏的名稱,並從類別問題ID你看看每個人有多少(如果有)問題。 問題表的非使用是故意的。此外,爲了執行此操作,您需要在BOTH命令中爲problem_categories編制索引。

更新:左連接可以是內連接,因爲與問題266相關的每個類別都至少有一個問題(問題266)。

1

您可以準備其中的類別和問題計數。之後,您可以將其用作任何查詢的一部分來提供信息。

SELECT categories.category_name , 
     categories.category_id, 
     (select COUNT(*) 
     from problem_categories 
     where problem_categories.category_id =categories.category_id 
     ) as num_problems 
FROM categories 

,可以在使用的連接(如果你願意存儲在一個臨時表),以補充有關的類別信息:

select problem_categories.problem_id, 
     temp_tab.category_name , 
     temp_tab.category_id, 
     temp_tab.num_problems    
from problem_categories, 
(
SELECT categories.category_name , 
     categories.category_id, 
     (select COUNT(*) 
     from problem_categories 
     where problem_categories.category_id =categories.category_id 
     ) as num_problems 
FROM categories 
) temp_tab 
where problem_categories.problem_id =266 
and problem_categories.category_id = temp_tab.category_id 

,如果你會使用這一個以上的ID如果沒有id條件,最好將類別中的信息存儲在臨時表中並加入以避免重複計算。

+0

@AJ這個工作...我打算給你的其他問題和遊戲者投票!!! – GeekedOut

+0

謝謝:)快樂它爲你工作:) –