2009-11-02 220 views
0

我想在一个语句中选择两个值而不是两个语句。第一个陈述是计算具有18的特定比赛获胜的条目数。第二个陈述计算该比赛的总奖金数量。SQL:子查询帮助

查询1:

SELECT 

COUNT(*) FROM entries 

WHERE entries.contest=18 

AND entries.won=1 

查询2

SELECT SUM(quantity) FROM prizes WHERE contest=18 

我想有两个,所以我可以在服务器端和作用在该比较比较它们。所以,如果我们有说3名获得第18届比赛的参赛者和第18届比赛的总奖金数为5,做点什么...

图示:

CREATE TABLE `entries` (
    `id` int(2) unsigned NOT NULL auto_increment, 
    `message_id` bigint(8) unsigned default NULL, 
    `user` int(2) unsigned default NULL, 
    `username` varchar(50) NOT NULL, 
    `contest` int(2) unsigned default NULL, 
    `message` text, 
    `icon` text, 
    `twitter_url` text, 
    `follower` int(2) unsigned default NULL, 
    `entry_date` timestamp NOT NULL default '0000-00-00 00:00:00', 
    `won` int(1) default '0', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 

CREATE TABLE `prizes` (
    `id` int(2) unsigned NOT NULL auto_increment, 
    `name` varchar(25) NOT NULL, 
    `contest` int(2) NOT NULL, 
    `quantity` int(2) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 

没有users表,因为我控制的条目,我敢肯定,我不会得到任何重复,所以这就是为什么用户名等存储的条目行。

回答

2

由于查询并没有什么共同点可言,你可以使用两个子查询,让他们在相同的结果:

select 
    (select count(*) from entries where contest = 18 and won = 1) as wins, 
    (select sum(quantity) from prizes where contest = 18) as quantity 
+0

真棒,谢谢。我只是意识到,我并没有真正追踪谁赢得了什么奖项,而只是当参赛者赢了或不赢时,“won”默认为0.我应该将“won”设置为奖金的pk而不是“1” '? – 2009-11-02 09:34:58

+0

嗯,只是觉得0或1可能是pk,我也可以更新奖品表,所以'id' pk从2开始。如果你可以参加,这将是非常棒的。 – 2009-11-02 09:41:41

+0

@meder:而不是“赢“字段,你可以有一个可以为空的”prize_id“字段。对于非赢局来说,空值将是一个更明显的指标,而不是一个像零的幻数。 – Guffa 2009-11-02 09:51:48