【问题标题】:I do not know how to build a SQL query correctly我不知道如何正确构建 SQL 查询
【发布时间】:2018-02-09 09:35:12
【问题描述】:

我使用 sqlite 数据库处理我的项目。在项目中有一个聊天,没有频道,只有一对一。这些是表格:

db.run(`CREATE TABLE IF NOT EXISTS user (
  id integer PRIMARY KEY AUTOINCREMENT,
  firstName varchar(30),
  lastName varchar(50),
  email varchar(150),
  phone varchar(12),
  address varchar(255),
  photo varchar(255),
  hash varchar(255),
  token varchar(255)
)`);
db.run(`CREATE TABLE IF NOT EXISTS chat (
  id integer PRIMARY KEY AUTOINCREMENT,
  lastMessage varchar(255)
)`);
db.run(`CREATE TABLE IF NOT EXISTS chatUser (
  id integer PRIMARY KEY AUTOINCREMENT,
  idChat integer,
  idUser integer,
  FOREIGN KEY (idChat) REFERENCES chat(id) ON DELETE CASCADE,
  FOREIGN KEY (idUser) REFERENCES user(id) ON DELETE CASCADE
)`);
db.run(`CREATE TABLE IF NOT EXISTS message (
  id integer PRIMARY KEY AUTOINCREMENT,
  idChat integer,
  idUser integer,
  text varchar(255),
  FOREIGN KEY (idChat) REFERENCES chat(id) ON DELETE CASCADE,
  FOREIGN KEY (idUser) REFERENCES user(id) ON DELETE CASCADE
)`);

chatUser 表中,我总是只添加两个用户(当前用户和重写它的用户)。我正在尝试查询以获取当前用户的聊天列表(列表应包括与我聊天的人的姓名、照片、聊天 ID 和最后一条消息)

db.all(`
  SELECT chatUser.idChat,
         user.firstName,
         user.lastName,
         user.photo,
         chat.lastMessage
  FROM user, chatUser, chat
  WHERE user.id = chatUser.idUser
  AND chat.id = chatUser.idChat
  AND user.id != ?
`, [id], function(error, chats) {
  ...
}

其中 id - 当前用户 ID。这一直有效,直到我来自另一个用户,他不是一个聊天,而是显示两个额外的聊天。请帮助我正确构建查询。

【问题讨论】:

  • 您正在寻找的是一个 JOIN,它基于一个列连接两个表,即用户 ID。不幸的是,做 table1, table2, table3 并没有那么有效。看; sqlitetutorial.net/sqlite-inner-join

标签: sql node.js sqlite


【解决方案1】:

您可以想象查询分为两个步骤:

  1. 您必须选择当前用户的聊天记录
  2. 您可以从当前用户的聊天中选择参与同一聊天的其他用户

当前用户的以下示例等于 1:

SELECT othersChatUser.idChat,
         user.firstName,
         user.lastName,
         user.photo,
         chat.lastMessage
  FROM 
    user, 
    chatUser as currentChatUser, 
    chatUser as othersChatUser, 
    chat
  WHERE currentChatUser.idUser = 1
  AND currentChatUser.idChat = othersChatUser.idChat
  AND user.id = othersChatUser.idUser
  AND user.id <> currentChatUser.idUser
  AND chat.id = othersChatUser.idChat;

您的查询结果:SQL Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2017-05-10
    相关资源
    最近更新 更多