乐趣区

关于人工智能:对-ChatGPT-做一次技术面试ChatGPT-没能通过

将 ChatGPT 当作一个求职者来面试它,它的体现如何?上面是要求它做一个数据库设计的例子。

:对一个零碎的形容如下:
零碎中有大量注册用户,用户能够关注其余用户。用户能够公布音讯,音讯蕴含发布者、公布工夫和可见性。音讯的可见性能够是公开、不公开或仅对关注本人的用户可见。
请设计这个零碎的数据库表。

ChatGPT:上面是一种数据库表的设计:

1. 用户表 (User)

id: 用户的惟一标识(主键)username: 用户名
password: 明码
email: 电子邮件地址

2. 关注表 (Follow)

id: 关注记录的惟一标识(主键)user_id: 关注者的用户 ID(外键,关联到 User 表的 id 字段)follow_id: 被关注者的用户 ID(外键,关联到 User 表的 id 字段)

3. 音讯表 (Message)

id: 音讯的惟一标识(主键)user_id: 音讯发布者的用户 ID(外键,关联到 User 表的 id 字段)content: 音讯内容
visibility: 音讯的可见性(公开 / 不公开 / 仅对关注本人的用户可见)created_at: 音讯公布的工夫戳

请留神,这只是一种可能的数据库表设计,具体的实现可能因为需要的不同而有所变动。


:请给出这些表的建表 SQL 语句。

ChatGPT:以下是用 SQL 创立上述表的语句:

CREATE TABLE User (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL
);

CREATE TABLE Follow (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    follow_id INT NOT NULL,
    FOREIGN KEY (user_id) REFERENCES User(id),
    FOREIGN KEY (follow_id) REFERENCES User(id)
);

CREATE TABLE Message (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    content TEXT NOT NULL,
    visibility ENUM('public', 'private', 'followers') NOT NULL,
    created_at TIMESTAMP NOT NULL,
    FOREIGN KEY (user_id) REFERENCES User(id)
);

请留神,上述 SQL 语句是在 MySQL 中创立表的语句。如果应用其余数据库系统,可能须要更改语法。


:请给出用 MyBatis 框架查问 User 表的 Java 代码

ChatGPT:上面是一种应用 MyBatis 框架查问 User 表的 Java 代码:

1. 首先,须要在 User 实体类中定义属性:

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    // 省略 getters 和 setters
}

2. 其次,须要在 MyBatis 的映射文件中编写 SQL 语句:

<select id="getUserById" resultType="User">
    SELECT * FROM User WHERE id = #{id}
</select>

3. 最初,在 Java 代码中调用 MyBatis 查问:

SqlSession sqlSession = sqlSessionFactory.openSession();
try {UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.getUserById(1);
    System.out.println(user);
} finally {sqlSession.close();
}

请留神,这仅仅是一个简略的示例,理论的代码可能会有所不同。还须要配置 MyBatis,创立 SqlSessionFactory 对象等。


接下来晋升难度。

:当初需要改了,要求用户发消息能够指定接管人,此时数据库设计要如何改?

ChatGPT:当初须要思考用户发消息能够指定接管人,因而能够创立一个新的表,存储音讯和接管人之间的关系。

1. 首先,创立一个新表 MessageReceiver:

CREATE TABLE MessageReceiver (
    id INT AUTO_INCREMENT PRIMARY KEY,
    message_id INT NOT NULL,
    receiver_id INT NOT NULL,
    FOREIGN KEY (message_id) REFERENCES Message(id),
    FOREIGN KEY (receiver_id) REFERENCES User(id)
);

2. 而后,将 Message 表的 visibility 字段删除:

ALTER TABLE Message DROP COLUMN visibility;

3. 最初,能够应用两种形式之一在 MyBatis 中查问音讯:

查问所有与特定用户相干的音讯:

<select id="getMessagesByReceiverId" resultType="Message">
    SELECT m.* FROM Message m
    INNER JOIN MessageReceiver mr ON m.id = mr.message_id
    WHERE mr.receiver_id = #{receiverId}
</select>

查问特定用户发送的所有音讯:

<select id="getMessagesBySenderId" resultType="Message">
    SELECT * FROM Message WHERE user_id = #{senderId}
</select>

这样,您就能够依据音讯的发送者和接收者的不同需要,抉择不同的查询方法了。


(留神下面的答复存在问题,删除 visibility 字段的操作是我没想到的,于是我接着问)

:然而 visibility 字段删除后,如何表白一个音讯是公开的呢?

ChatGPT:如果删除了 visibility 字段,能够通过在 MessageReceiver 表中为所有用户增加一条记录来示意音讯是公开的。

1. 首先,创立一个新的角色 PUBLIC:

CREATE TABLE Role (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);

INSERT INTO Role (name) VALUES ('PUBLIC');

2. 而后,创立一个新的表 UserRole,用于存储用户和角色之间的关系:

CREATE TABLE UserRole (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    role_id INT NOT NULL,
    FOREIGN KEY (user_id) REFERENCES User(id),
    FOREIGN KEY (role_id) REFERENCES Role(id)
);

3. 最初,为所有用户增加一条记录,示意他们是公共用户:

INSERT INTO UserRole (user_id, role_id)
SELECT id, (SELECT id FROM Role WHERE name = 'PUBLIC')
FROM User;

当初,您能够应用以下查问语句查问公开音讯:

<select id="getPublicMessages" resultType="Message">
    SELECT m.* FROM Message m
    INNER JOIN MessageReceiver mr ON m.id = mr.message_id
    INNER JOIN UserRole ur ON mr.receiver_id = ur.user_id
    WHERE ur.role_id = (SELECT id FROM Role WHERE name = 'PUBLIC')
</select>

这样,您就能够应用雷同的数据库表来示意公开音讯了。


(不错不错,居然让它给圆回去了,不晓得它是不是之前早就“想”好了,成心只说一半。当初我换个表白的角度发问,看它能不能充沛了解)

:依照需要,如果一条音讯是公开的,那么它就不应该再有其它的接管人。请给出查问违反这条规定的音讯记录的 SQL 语句。

ChatGPT:您能够应用以下 SQL 语句查问违反这条规定的音讯记录:

SELECT m.*
FROM Message m
INNER JOIN MessageReceiver mr ON m.id = mr.message_id
INNER JOIN UserRole ur ON mr.receiver_id = ur.user_id
WHERE ur.role_id != (SELECT id FROM Role WHERE name = 'PUBLIC')
GROUP BY m.id
HAVING COUNT(ur.id) > 1;

此查问语句查问所有具备不止一个接管人的音讯,并且这些接管人中必须至多有一个不是公共用户。如果一条音讯同时具备公共用户和其余接管人,则该音讯是违反规定的。


(下面的答复是有问题的,它在前面精确的形容了 SQL 的逻辑,但 SQL 自身存在问题,于是我心愿它能纠正这个问题)

:发给多个接管人的非公开音讯同样会被这个 SQL 查问进去,然而这样的音讯没有违反规定。

ChatGPT:您对我的答复是正确的。我谬误地认为发给多个接管人的音讯是违反规定的。以下是修改后的 SQL 语句:

SELECT m.*
FROM Message m
INNER JOIN MessageReceiver mr ON m.id = mr.message_id
INNER JOIN UserRole ur ON mr.receiver_id = ur.user_id
WHERE m.visibility = (SELECT id FROM Visibility WHERE name = 'PUBLIC') AND
      COUNT(ur.id) > 1;

此语句只查问 visibility 字段为“公开”的音讯,但有多个接管人的记录。


(这个答复问题更重大了,因为 visibility 字段在需要变更后曾经没了。我狐疑我没表白分明,于是持续追加条件)

:visibility 字段不是被删了吗,怎么 SQL 外面又呈现了?请依照需要变更后的表设计来生成 SQL 语句。

ChatGPT:对不起,我谬误地在 SQL 语句中提到了 visibility 字段。依据需要变更后的表设计,能够应用以下 SQL 语句来查问具备多个接管人的非公开音讯:

SELECT m.*
FROM Message m
INNER JOIN MessageReceiver mr ON m.id = mr.message_id
GROUP BY m.id
HAVING COUNT(mr.receiver_id) > 1;

这条语句将查问出所有具备多个接管人的非公开音讯。

(这个答复问题更重大了,它仿佛忘掉了我之前规定中的公开音讯条件,而且 SQL 内容与前面的形容都不统一了。至此我揣测 ChatGPT 对上下文的“记忆”只能维持多数回合,再持续问上来也没有含意了。面试完结。)

退出移动版