我有以下问题:我有三个表:日志、媒体和用户。
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 :),但它说我的查询完全没问题,应该返回我的结果集。
如果我理解正确,这会有帮助吗?
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