2010-01-06 43 views
0

查詢可以變爲動態嗎?根據所選類別計數行以進行查詢的查詢中的查詢

SELECT master.id, 
(select count(0) as score1 from scores where scores.id = master.id AND scores.category = '1'), 
(select count(0) as score2 from scores where scores.id = master.id AND scores.category = '2'), 
(select count(0) as score3 from scores where scores.id = master.id AND scores.category = '3'), 
(repeat for as many categories chosen by the current user) 
score1+score2+score3 AS score FROM master ORDER BY score DESC LIMIT 1 

我知道這個語法不正確。

我想要的效果取決於用戶選擇的類別,我想查找記錄。每個記錄都在另一個表中打分。

我希望能夠多次重複查詢在括號中,因爲基於另一個ID是在另一個數據庫中找到類別:

anotherid,category 
1,1 
1,2 
1,3 
2,2 
2,3 
3,1 
3,2 
3,3 

所以,如果我通過「1」,上面的查詢我'喜歡它重複括號中的查詢結果類別1,2和3(因此三個查詢導致三個分數加起來總計)。

我曾試着問過這個問題,但我認爲我過於複雜的東西!

UPDATE:

我剛纔提出這個查詢 - 我認爲它的工作原理。任何人都看到明顯的錯誤?

SELECT 
users.id, 
users.url, 
(
SELECT SUM(scoretot.scr) FROM scoretot WHERE scoretot.id = users.id AND scoretot.category 
IN (
SELECT category FROM getprefs WHERE member = '2' 
) 
) AS score 
FROM users 
ORDER BY score DESC limit 1 

值2將在Perl查詢被動態地創建(這將是當前用戶的ID)。

我有兩種觀點

create view getprefs select `prefs`.`category` AS `category`,`prefs`.`member` AS `member` from `prefs` 

create view scoretot select count(`scores`.`ref`) AS `scr`,`scores`.`id` AS `id`,`scores`.`category` AS `category` from `scores` group by `scores`.`category` 

和三個表:

表用戶:

id,url 
1,www.test.com 
2,www.test2.com 
3,www.test3.com 

表分數:

id,category 
1,1 
1,1 
1,2 
1,2 
1,3 
1,3 
1,3 
2,2 
3,1 
3,3 
3,3 
3,3 
3,2 

表首選項

member,category 
1,1 
1,2 
1,3 
2,1 
3,1 
3,3 

「認爲」這是它....

+0

這將是更容易使返回你想,如果值查詢您將每個值作爲單獨的行而不是列返回。你有沒有考慮過這個選項? – 2010-01-06 21:51:43

+0

@克里斯,你的例子是這樣的難讀。您能否使用換行符重新格式化它,並將SQL關鍵字大寫? – 2010-01-06 22:07:00

+0

嗨,我已根據要求更改了上述「創意」代碼。感謝您的期待! – 2010-01-06 22:28:08

回答

0

是的,基本上你想編寫一個數據透視表。 首先,一個更簡單的方式做到這一點,用更少的打字和更少的開銷將是:

SELECT master.id 
,   SUM(IF(s.category='1',1,0)) cat1 
,   SUM(IF(s.category='2',1,0)) cat2 
,   SUM(1)      total 
FROM  master m 
LEFT JOIN scores s 
ON  m.id = s.id 
GROUP BY master.id 

(這裏是一個exaplanation和背景:http://rpbouman.blogspot.com/2005/10/creating-crosstabs-in-mysql.html

訣竅,當然是動態生成列。原來,你可以用存儲過程來做到這一點。這裏是你如何能做到這樣的例子: http://www.futhark.ch/mysql/106.html

如果你正在使用MySQL代理,你也可以看看http://forge.mysql.com/wiki/ProxyCookbook

+0

非常接近,謝謝!我可以做的是根據用Perl選擇的類別創建我自己的sql語句。這與一個普遍的觀點相結合,我在那裏!有一天,我想我可以讓我的頭部圍繞單個SQL語句,但這不是必要的! – 2010-01-07 00:03:51

+0

有一個Perl的解決方案已經: http://dev.mysql.com/tech-resources/articles/wizard/index.html – 2010-01-07 01:17:56

+0

訪問您的聯繫和閱讀的一切後,這正是我需要的。非常感謝!剛剛把它付諸行動... :( – 2010-01-07 01:58:24

0

可讀性更好,我會建議你創建你的子查詢單獨views

CREATE VIEW v_scores_category1 AS 
    SELECT count(0) AS score1 
    FROM scores where scores.id = mASter.id AND scores.category = '1' 

CREATE VIEW v_scores_category2 AS 
    SELECT count(0) AS score2 
    FROM scores where scores.id = id AND scores.category = '2' 

然後......

SELECT mASter.id, 
(SELECT score1 FROM v_scores_category1), 
(SELECT score2 FROM v_scores_category2), 
score1+score2 AS score FROM mASter ORDER BY score DESC LIMIT 1 

BTW:我知道這個語法不正確;)...

+0

它按類別想,我可以有一個視圖所有例如 CREATE VIEW getscores SELECT COUNT(ID)爲可控硅,類別FROM成績GROUP(我認爲),然後選擇scr FROM getscores WHERE category = [whatever] – 2010-01-07 00:08:01