如何在 MySQL 中对同一个表的多个列进行 INNER JOIN

问题描述 投票:0回答:1

我有以下问题:我有三个表:日志、媒体和用户。

CREATE TABLE `users` (
  `id` INTEGER NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB
ROW_FORMAT=DEFAULT;
CREATE TABLE `media` (
  `id` INTEGER NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB
ROW_FORMAT=DEFAULT;
CREATE TABLE `log` (
  `id` INTEGER NOT NULL AUTO_INCREMENT,
  `action` VARCHAR(20) NOT NULL,
  `action_time` DATETIME NOT NULL,
  `user_id` INTEGER NOT NULL,
  `affected_user_id` INTEGER DEFAULT NULL,
  `media_id` INTEGER DEFAULT NULL,
  `comment` TEXT DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB
ROW_FORMAT=DEFAULT;

日志表的要点是,所做的每个操作都是由用户完成的,但有些操作会影响用户,有些操作会影响媒体,但并非总是如此。
user_id、affected_user_id 列是 users.id 的外键
media_id 列是 media.id 的外键

我想做的是对日志进行 SELECT 查询,并与其他两个表进行 INNER JOIN。

首先我尝试了这个查询,不知道出了什么问题,所以这将是我第一次尝试做这样的事情:

SELECT log.action, log.action_time, log.user_id, user_name_table.name AS user_name, 
log.affected_user_id, affected_user_name_table.name AS affected_user_name, 
log.media_id, media.title AS media_title, log.comment 
FROM log 
INNER JOIN users AS user_name_table ON user_name_table.id = log.user_id 
INNER JOIN users AS affected_user_name_table ON affected_user_name_table.id = log.affected_user_id 
INNER JOIN media ON media.id = log.media_id 
WHERE log.user_id=1 OR log.affected_user_id=1

我在互联网上查找了如何在两列上 INNER JOIN 同一张表,我真的不知道它是否正确,也许这也是问题所在。我希望此查询返回日志表的所有列以及与 user_id 和affected_user_id 关联的用户的名称。

在日志表中,有足够多的行,其中 user_id=1 或affected_user_id=1。但不知何故,我的结果集是空的。我没有收到错误消息,所以我的查询语法应该没问题。

我还尝试了一些其他版本,例如:

SELECT log.action, log.action_time, log.user_id, users.name AS user_name, log.affected_user_id, 
log.media_id, media.title AS media_title, log.comment 
FROM log 
INNER JOIN users ON users.id = log.user_id OR users.id=log.affected_user_id
INNER JOIN media ON media.id = log.media_id 
WHERE log.user_id=1 OR log.affected_user_id=1
SELECT log.action, log.action_time, log.user_id, users.name AS user_name, 
log.affected_user_id, 
log.media_id, media.title AS media_title, log.comment 
FROM log 
INNER JOIN users ON users.id = log.user_id = affected_user_id
INNER JOIN media ON media.id = log.media_id 
WHERE log.user_id=1 OR log.affected_user_id=1

我在网上搜索了解决方案,但似乎没有找到。我什至问过 ChatGPT :),但它说我的查询完全没问题,应该返回我的结果集。

sql mysql select inner-join resultset
1个回答
0
投票

如果我理解正确,这会有帮助吗?

SELECT log.action,
       log.action_time,
       log.user_id,
       users.name AS user_name,
       log.affected_user_id,
       log.media_id,
       media.title AS media_title,
       log.comment
  FROM log
       INNER JOIN users
          ON    (    users.id = log.user_id
                 AND log.user_id = 1)
             OR (    users.id = log.affected_user_id
                 AND log.affected_user_id = 1)
       INNER JOIN media ON media.id = log.media_id
© www.soinside.com 2019 - 2024. All rights reserved.