首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql比较动态计数值

sql比较动态计数值
EN

Stack Overflow用户
提问于 2012-08-08 20:14:42
回答 1查看 306关注 0票数 0

首先,这只是一个测试表,我想学习一些sql查询。我想知道谁像“peter”一样经常预订相同的航班(从明晨出发)。给出正确结果的查询是:

代码语言:javascript
复制
SELECT r1.vorname
FROM (
SELECT p1.vorname, count(p1.passnr) as anzahl
FROM passagier p1, teilnehmer t1, abflug a
WHERE a.abflug = 'münchen'
AND t1.flugnr = a.flugnr
AND t1.passnr = p1.passnr
group by p1.passnr ) as r1,
(
SELECT p1.vorname, count(p1.passnr) as anzahl
FROM passagier p1, teilnehmer t1, abflug a
WHERE a.abflug = 'münchen'
AND t1.flugnr = a.flugnr
AND t1.passnr = p1.passnr
group by p1.passnr ) as r2

WHERE r2.vorname = 'peter'
AND r1.vorname != 'peter'
AND r1.anzahl = r2.anzahl

有没有更好的查询来获得相同的结果?

代码语言:javascript
复制
--
-- Table structure for table `abflug`
--

CREATE TABLE IF NOT EXISTS `abflug` (
  `flugnr` varchar(30) NOT NULL,
  `zielkrz` varchar(30) NOT NULL,
  `ziel` varchar(30) NOT NULL,
  `abflkrz` varchar(30) NOT NULL,
  `abflug` varchar(30) NOT NULL,
  PRIMARY KEY (`flugnr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `abflug`
--

INSERT INTO `abflug` (`flugnr`, `zielkrz`, `ziel`, `abflkrz`, `abflug`) VALUES
('ba921', 'fra', 'frankfurt', 'muc', 'münchen'),
('lh807', 'nrt', 'tokyo narita', 'fra', 'frankfurt'),
('lh808', 'fra', 'frankfurt', 'kix', 'osaka kansai'),
('lh809', 'kix', 'osaka kansai', 'fra', 'frankfurt');


--
-- Table structure for table `passagier`
--

CREATE TABLE IF NOT EXISTS `passagier` (
  `passnr` varchar(30) NOT NULL,
  `vorname` varchar(30) NOT NULL,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY (`passnr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `passagier`
--

INSERT INTO `passagier` (`passnr`, `vorname`, `name`) VALUES
('10118', 'gerhard', 'schröder'),
('10120', 'peter', 'müller'),
('10123', 'angela', 'merkel'),
('10999', 'aryan', 'layes'),
('11000', 'jessica', 'alba');

--
-- Table structure for table `teilnehmer`
--

CREATE TABLE IF NOT EXISTS `teilnehmer` (
  `flugnr` varchar(30) NOT NULL,
  `passnr` varchar(30) NOT NULL,
  `datum` varchar(30) NOT NULL,
  PRIMARY KEY (`flugnr`,`passnr`,`datum`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `teilnehmer`
--

INSERT INTO `teilnehmer` (`flugnr`, `passnr`, `datum`) VALUES
('ba921', '10120', '20.1.2012'),
('ba921', '10120', '23.1.2012'),
('ba921', '10123', '20.1.2012'),
('ba921', '10999', '20.1.2012'),
('ba921', '10999', '23.1.2012'),
('ba921', '11000', '23.1.2012'),
('lh807', '10118', '20.1.2012'),
('lh807', '10120', '20.1.2012'),
('lh807', '10123', '20.1.2012'),
('lh808', '10118', '27.3.2012'),
('lh808', '10120', '23.1.2012'),
('lh808', '10123', '23.1.2012'),
('lh809', '10120', '23.1.2012');
EN

回答 1

Stack Overflow用户

发布于 2012-08-08 21:42:03

可能还有更有效的方法。下面的查询计算子查询中Peter的信息,并将其连接到查询的其余部分:

代码语言:javascript
复制
select allp.*
from (SELECT p.passnr, count(p1.passnr) as anzahl
      FROM passagier p join
           teilnehmer t
           on t.passnr = p.passnr join
           abflug a
           on t.flugnr = a.flugnr
      where a.abflug = 'münchen'
      group by p.passnr
     ) allp cross join
     (SELECT count(p1.passnr) as anzahl
      FROM passagier p join
           teilnehmer t
           on t.passnr = p.passnr join
           abflug a
           on t.flugnr = a.flugnr 
      where a.abflug = 'münchen' AND
            p.vorname = 'peter'
      limit 1
     ) peter
where allp.forname <> 'peter' and allp.anzahl >= peter.anzahl

"limit“的使用是为了防止数据中有多个Peter。

您还可以使用"with“语句来简化这一过程:

代码语言:javascript
复制
with allp as (
      SELECT count(p1.passnr) as anzahl
      FROM passagier p join
           teilnehmer t
           on t.passnr = p.passnr join
           abflug a
           on t.flugnr = a.flugnr 
      where a.abflug = 'münchen'
     ) allp 
select *
from allp
where allp.forname <> 'peter' and
      allp.anzahl >= (select anzahl from allp where vorname = 'peter' limit 1)

此版本按乘客汇总所有数据。在mysql中,第一个版本可能执行得更好,因为where子句中的子查询(可能)将在每一行上进行计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11864301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档