【问题标题】:SQL: Subquery assistanceSQL:子查询帮助
【发布时间】:2009-11-02 09:19:15
【问题描述】:

我试图在一个语句而不是两个语句中选择两个值。第一个语句计算 id 为 18 的特定竞赛赢得了多少参赛作品。第二个语句计算该竞赛的奖品总数。

查询 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 表,因为我控制条目,而且我很确定我不会得到任何重复项,所以这就是为条目行存储用户名等的原因。

【问题讨论】:

    标签: sql mysql subquery


    【解决方案1】:

    由于查询根本没有任何共同点,您可以使用两个子查询来获得相同的结果:

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

    【讨论】:

    • 太棒了,谢谢。我刚刚意识到,我并没有真正追踪谁赢得了什么奖品,而是只追踪一个参赛者是否中奖,won 默认为 0。我是否应该将won 设置为奖品的 pk 而不是 @987654324 @?
    • 嗯,我只是想0或1可能是一个pk,我也可以更新奖品表,让id pk从2开始。如果你能插话就好了。跨度>
    • @meder:您可以有一个可以为空的“prize_id”字段,而不是“win”字段。与零这样的幻数相比,空值更能明确表示未获胜。
    • 好主意,我将进行必要的架构更改。谢谢。