SQL - 加入两个不同的结果集

时间:2017-02-13 11:08:04

标签: mysql sql database join

我是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工作,即使两个选择似乎分开工作。任何想法或建议将不胜感激,谢谢!

3 个答案:

答案 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的用户同时归功于Buser_phone_number 75772 ,因此我们最终得到了 - < / p>

{{1}}

我同意您可能想要考虑其他人提出的一些观点,但不会重复。