输出出现超过x次的记录

时间:2014-02-21 05:15:39

标签: sql

我是SQL的初学者,我需要帮助来获得这种情况的解决方案。

在一个月内输出购买门票超过4天的任何人的姓名。 (另外,输出月份。)

create table visitor( 
visitID         char(n),
name            char(n) not null,
primary key (visitID)
);

create table ticket(
ticketID        char(n),
ticketType      char(n),
day             int(n),
month           char(n),
year            int(n),
visitID         char(n),
primary key (ticketID), foreign key (visitID) references visitor
);

我无法测试我的代码,但到目前为止我的代码是

SELECT name, month
FROM Visitor NATURAL JOIN Ticket AS t
JOIN (SELECT name, month
    FROM Visitor NATURAL JOIN Ticket 
    GROUP BY month, year
    HAVING COUNT(1) > 4
) AS s
ON t.name = s.name AND t.month = s.month;

我不知道这是否正确。 请帮忙。

3 个答案:

答案 0 :(得分:1)

SELECT s.name, t.month
FROM Visitor inner JOIN Ticket AS t
ON t.visitID= s.visitID
group by month, year
having count(day)>4

答案 1 :(得分:1)

您的查询在技术上可能是正确的。但是子查询回答了你的问题:

SELECT name, month
FROM Visitor NATURAL JOIN Ticket 
GROUP BY month, year
HAVING COUNT(1) > 4;

但有两点。不要使用natural join。根据表中列的名称,它可以做一些奇怪的事情。使用onusing明确命名列。而且,在某些数据库中,monthyear可能是保留字。所以他们是列的坏名字。您可以使用双引号引用它们(在大多数数据库中)。所以:

SELECT "month", "year"
FROM Visitor INNER JOIN
     Ticket 
     using (VisitorId)
GROUP BY "month", "year"
HAVING COUNT(1) > 4;

查询可能需要计算不同的日期。在这种情况下,having子句应为:

HAVING count(distinct "day") > 4

答案 2 :(得分:0)

我刚开始学习Mysql。我仍然在阅读基本语法,所有内容都无法提供帮助。但是你不认为你的问题存在错误。由于访问者表中的名称属性不是唯一的(它甚至不应该是唯一的)。所以基本上你找不到同一个人。你只是试图找到一个月来访问公园4次的同名人物。