我是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;
我不知道这是否正确。 请帮忙。
答案 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
。根据表中列的名称,它可以做一些奇怪的事情。使用on
或using
明确命名列。而且,在某些数据库中,month
和year
可能是保留字。所以他们是列的坏名字。您可以使用双引号引用它们(在大多数数据库中)。所以:
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次的同名人物。