我是SQL新手,刚刚完成了第一次任务。
我有以下要求: 给定是两个表的数据库。第一个包含有关用户的信息,例如每个用户的唯一ID,电话号码和城市。 ID和电话号码仅由数字组成。第二个表包含用户可以拥有的所谓“信用”的数据。同样,有一个唯一用户ID列,但也有一个列,数字,日期和信用类型。用户可以在信用表中没有,一个或多个条目。
我现在仍然确定我是否正确用户可以在信用表中没有,一个或多个条目的部分。我创建了这两个表:
CREATE table user
(
user_id INT NOT NULL UNIQUE AUTO_INCREMENT,
user_phone_number INT NOT NULL,
user_city VARCHAR(32) NOT NULL,
PRIMARY KEY (user_id)
);
CREATE table credit
(
credit_user_id INT FOREIGN KEY (user_id),
credit_date date,
credit_number double,
credit_type char(10),
CONSTRAINT chk_type CHECK (credit_type in ('None','A','B','C')),
);
创建此内容后,我被问到以下问题:
a)拥有“A”类型信用的所有用户的电话号码
SELECT user_phone_number
FROM user, credit
WHERE credit_type = 'A';
b)与a)类似,但另外信用的credit_number小于2或大于4
SELECT user_phone_number
FROM user, credit
WHERE (credit_type ='A')
AND (credit_number < 2 OR credit_number > 4);
C)像a),但另外用户还拥有至少一种其他类型的信用。
SELECT user_phone_number
FROM user, credit
WHERE credit_type = 'A'
AND (
SELECT DISTINCT c1.credit_type FROM credit AS c1
JOIN credit a1 ON (c1.credit_type=a1.credit_type)
JOIN credit a2 ON (c1.credit_type=a2.credit_type)
WHERE a2.credit_type<>a1.credit_type);
我的问题是我不能让字母C工作,即使两个选择似乎分开工作。任何想法或建议将不胜感激,谢谢!
答案 0 :(得分:0)
我不确定你在C中想要什么,但还有很多话要说。
您不应该使用像&#39; user&#39;这样的数据库名称。因为对于SGBD来说它可能是不明确的(保留字)。
您应该更喜欢加入&#39;而不是来自table1,table2&#39;和/或混合两者。 Have a look here.
你已经&#39 ;;&#39;在您的C)请求中,该请求必须仅用于指定请求的结束。
你可以使用嵌套的resquet但不是那样,而不是直接在&#39; AND&#39;因为AND是为了比较条件。你有很多可能性:在选择fied,在&#39; FROM&#39;之后&#39; IN&#39;,加入,条件...... Quick search on google.
答案 1 :(得分:0)
来自另一篇文章:
PRIMARY KEY(x),UNIQUE(x) - 因为PRIMARY KEY根据定义(在MySQL中)UNIQUE ...
由于你想找到有两种信用额度的人,我会尝试进行查询,就像我在寻找重复信息一样,这里有两种方法: 带子查询 Find duplicate records in MySQL 没有 Finding duplicate values in MySQL
答案 2 :(得分:0)
欢迎来到SO!这是使用您尝试使用的嵌套查询样式的方法。我在FROM user, credit
子句中使用了明确的JOIN而不是FROM
,因为这样可以更清楚地表明它是一个连接。
说你的users
表看起来像这样 -
user_id user_phone_number user_city
6 75771 Leeds
7 75772 Wakefield
8 75773 Dewsbury
9 75774 Heckmondwike
10 75775 Huddersfield
你的credit
表看起来像这样 -
credit_user_id credit_date credit_number credit_type
7 2017-02-13 2 A
7 2017-02-13 2 B
6 2017-02-13 2 A
8 2017-02-13 4 B
AND
子句中的嵌套查询返回credit_type
不 A
的记录,主查询中的WHERE
选择credit_type
A
的所有记录,因此如果记录同时出现,则用户必须有两种类型的信用 -
SELECT user_phone_number
FROM [user] AS u
JOIN credit AS c ON u.user_id = c.credit_user_id
WHERE credit_type = 'A'
AND u.user_id IN (
SELECT user_id
FROM [user] AS u
JOIN credit AS c ON u.user_id = c.credit_user_id
WHERE credit_type <> 'A')
正如您在表格中看到的那样,id
7
A
的用户同时归功于B
和user_phone_number
75772
,因此我们最终得到了 - < / p>
{{1}}
我同意您可能想要考虑其他人提出的一些观点,但不会重复。