【问题标题】:MySQL / PHP - Conversation SystemMySQL / PHP - 对话系统
【发布时间】:2026-01-25 23:40:01
【问题描述】:

我很难弄清楚这一点。我正在尝试制作一个对话系统,它会像这样工作:

登录的用户会有一个指向“对话”的链接。在该页面上会显示所有会话标题的列表。单击对话名称时,对话消息(主要在 2 个用户之间,但可能更多)将显示如下:

对话倾斜...

|---------------------------------------------- --------------|
|发送按钮|此处为新消息的文本字段 |
|----------------|-------------------------------- -----------|

发件人:嗨.......(08/24/11 - 12PM)

接收者:嗨!.....(2011 年 8 月 24 日 - 晚上 11 点

发件人:bla blah...(2011 年 8 月 24 日 - 晚上 10 点)

等等。

我在对话本身中列出消息没有问题,而是获取用户参与的对话列表。

我得到同一个实例的多个结果。

我想要一个查询来生成登录用户通过发送消息、接收消息或两者参与的所有对话的列表。

我想我需要一个嵌套查询,但我不知道该怎么做。所以我有点卡在这里,尝试内部连接所有表并没有削减奶酪。

这是 设计/ER 模型:

-- -----------------------------------------------------

-- Table `firm`.`conversation`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `firm`.`conversation` (

  `conversation_id` INT NOT NULL AUTO_INCREMENT ,

  `title` VARCHAR(45) NULL ,

  `date` TIMESTAMP NULL ,

  PRIMARY KEY (`subject_id`) )

ENGINE = InnoDB;

 

-- -----------------------------------------------------

-- Table `firm`.`message`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `firm`.`message` (

  `message_id` INT NOT NULL AUTO_INCREMENT ,

  `message` LONGTEXT NULL ,

  `date` TIMESTAMP NOT NULL ,

  `read_sender` BINARY NOT NULL ,

  `read_receiver` BINARY NOT NULL ,

  `deleted_receiver` BINARY NOT NULL ,

  `deleted_sender` BINARY NOT NULL ,

  `conversation_id` INT NOT NULL ,

  PRIMARY KEY (`message_id`) ,

  INDEX `fk_message_subject1` (`subject_id` ASC) ,

  CONSTRAINT `fk_message_con1`

    FOREIGN KEY (`conversation_id` )

    REFERENCES `firm`.`conversation` (`conversation_id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB

DEFAULT CHARACTER SET = latin1

COLLATE = latin1_swedish_ci;

 

-- -----------------------------------------------------

-- Table `firm`.`outbox`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `firm`.`outbox` (

  `outbox_id` INT NOT NULL AUTO_INCREMENT ,

  `user_id` INT(10) NOT NULL ,

  `conversation_id` INT(10) NOT NULL ,

  `date` TIMESTAMP NOT NULL ,

  PRIMARY KEY (`outbox_id`) ,

  INDEX `fk_outbox_users1` (`user_id` ASC) ,

  INDEX `fk_utbox_con1` (`conversation_id` ASC) ,

  CONSTRAINT `fk_outbox_users1`

    FOREIGN KEY (`user_id` )

    REFERENCES `firm`.`users` (`user_id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION,

  CONSTRAINT `fk_outbox_con1`

    FOREIGN KEY (`conversation_id` )

    REFERENCES `firm`.`conversation` (`conversation_id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB

 

-- -----------------------------------------------------

-- Table `firm`.`inbox`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `firm`.`inbox` (

  `inbox_id` INT NOT NULL ,

  `user_id` INT(10) NOT NULL ,

  `message_id` INT NOT NULL ,

  `read` BINARY NOT NULL ,

  `date` TIMESTAMP NOT NULL ,

  PRIMARY KEY (`inbox_id`) ,

  INDEX `fk_inbox_users1` (`user_id` ASC) ,

  INDEX `fk_inbox_message` (`message_id` ASC) ,

  CONSTRAINT `fk_inbox_users1`

    FOREIGN KEY (`user_id` )

    REFERENCES `firm`.`users` (`user_id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION,

  CONSTRAINT `fk_inbox_message1`

    FOREIGN KEY (`message_id` )

    REFERENCES `frim`.`message` (`message_id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB;

【问题讨论】:

    标签: database mysql php mysql database-design message


    【解决方案1】:
    SELECT DISTINCT conversation.conversation_id
    FROM conversation
    INNER JOIN message ON message.conversation_id = conversation.conversation_id
    INNER JOIN inbox   ON inbox.message_id = message.message_id
    INNER JOIN outbox  ON inbox.message_id = message.message_id
    WHERE outbox.user_id = #USER# 
    OR    inbox.user_id = #USER#
    

    这个连接应该可以工作。 DISTINCT,因为用户很可能作为发件人和收件人参与。

    【讨论】:

    • 感谢您的快速回复,我现在正在工作,但我一回到家就试试。看起来很有希望!
    • 嗨,cularis!您的方法似乎不起作用,无论我使用哪个 user_id,我都会得到相同的结果。
    • 你能发布一些示例数据吗?
    • SELECT DISTINCT conversation.conversation_id FROM conversation INNER JOIN message ON message.conversation_id = conversation.conversation_id INNER JOIN inbox ON inbox.message_id = message.message_id INNER JOIN outbox ON outbox.conversation_id = message.conversation_id WHERE outbox.user_id =#USER# OR inbox.user_id = #USER#
    • 抱歉,我不知道如何正确格式化 :( 但该查询似乎有效