【问题标题】:SQL to retrieve results just between two usersSQL 仅在两个用户之间检索结果
【发布时间】:2015-06-07 19:07:16
【问题描述】:

我需要检索两个用户之间的对话,但我不知道如何...我的结果有不需要的对话,我当前的 sql:

select *
from user_talk t1
inner join user_talk t2 on t2.id = t1.id
where
    t1.talk_id = t2.talk_id and
    (
        t1.user_id = 1 or
        t2.user_id = 4
    );

此 sql 显示用户 1 和 4 之间的结果,但也显示用户 1 和用户 2 以及用户 2 和 65 之间的结果,但我只想要用户 1 和 4。

如何写出正确的sql?

编辑:user_talks

CREATE TABLE IF NOT EXISTS `reverse`.`user_talk` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `talk_id` INT(10) UNSIGNED NOT NULL,
  `user_id` INT(10) UNSIGNED NOT NULL,
  `type` VARCHAR(10) NOT NULL DEFAULT 'INVITED',
  `status` VARCHAR(10) NOT NULL DEFAULT 'ACTIVE',
  `created_at` TIMESTAMP NULL,
  `updated_at` TIMESTAMP NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_usertalk_1_idx` (`user_id` ASC),
  INDEX `fk_usertalk_2_idx` (`talk_id` ASC),
  INDEX `user_in_talk_idx` (`talk_id` ASC, `user_id` ASC),
  CONSTRAINT `fk_usertalk_1`
    FOREIGN KEY (`user_id`)
    REFERENCES `reverse`.`user` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_usertalk_2`
    FOREIGN KEY (`talk_id`)
    REFERENCES `reverse`.`talk` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

谈话

CREATE TABLE IF NOT EXISTS `reverse`.`talk` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `created_at` TIMESTAMP NULL,
  `updated_at` TIMESTAMP NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB

消息

CREATE TABLE IF NOT EXISTS `reverse`.`message` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `talk_id` INT(10) UNSIGNED NOT NULL,
  `sender_id` INT(10) UNSIGNED NOT NULL,
  `receiver_id` INT(10) UNSIGNED NOT NULL,
  `body` TEXT NOT NULL,
  `status` VARCHAR(10) NOT NULL DEFAULT 'UNREAD',
  `created_at` TIMESTAMP NULL,
  `updated_at` TIMESTAMP NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_message_1_idx` (`sender_id` ASC),
  INDEX `fk_message_2_idx` (`receiver_id` ASC),
  INDEX `fk_message_3_idx` (`talk_id` ASC),
  CONSTRAINT `fk_message_1`
    FOREIGN KEY (`sender_id`)
    REFERENCES `reverse`.`user` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_message_2`
    FOREIGN KEY (`receiver_id`)
    REFERENCES `reverse`.`user` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_message_3`
    FOREIGN KEY (`talk_id`)
    REFERENCES `reverse`.`talk` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

【问题讨论】:

  • 描述您的架构。你也只需要谈话或用户数据吗?
  • @FLefèvre 见表 sql。现在只是 user_talks 数据。谢谢!
  • 还要描述您的talk 表。但我认为我的答案应该有效。
  • 是的,你的回答很好。谢谢!

标签: php mysql sql select laravel


【解决方案1】:

从用户 1 到用户 4 以及从用户 4 到用户 1 选择 user_talks:

SELECT *
FROM user_talk t1
INNER JOIN user_talk t2 ON t1.talk_id = t2.talk_id
WHERE 
    (t1.user_id = 1 AND t2.user_id = 4)
    OR
    (t1.user_id = 4 AND t2.user_id = 1)

我解释一下:

  • 您需要从 2 个用户中选择 user_talk,所以我从 2 个表中选择。
  • 你需要选择对话,所以我猜talk_id应该是一样的。
  • 您需要从用户 1 到 4 或从用户 4 到 1。

【讨论】:

    【解决方案2】:

    (请试试这个

    select *
      from user_talk t1
           inner join user_talk t2 on t1.id = t2.id
     where (t1.user_id = 1 or t1.user_id = 4)
       and (t2.user_id = 1 or t2.user_id = 4);
    

    UPDATE : 刚刚为下面显示的数据运行了这个 SQL

    得到这个结果,只适用于user_id 1 & 4

    【讨论】:

    • sql结果和我的sql一样,在我的回答中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2018-08-11
    相关资源
    最近更新 更多