【发布时间】:2013-10-30 11:15:02
【问题描述】:
我使用这些查询来选择具有相似阅读选择的用户的 user_ids。
SELECT r2.user_id
FROM `read` r1
JOIN `read` r2
ON r1.user_id <> r2.user_id AND r1.book_id = r2.book_id
WHERE r1.user_id = 1
GROUP BY r2.user_id
HAVING count(*) >= 5
但我不想简单地显示 user_id。还有其他表中有关此 user_id 的数据!
上面的查询只使用这个表:
CREATE TABLE `read` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`book_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `No duplicates` (`user_id`,`book_id`),
KEY `book_id` (`book_id`),
CONSTRAINT `connections_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `connections_ibfk_2` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
但我也有:
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`email` char(255) NOT NULL DEFAULT '',
`password` char(12) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
和
CREATE TABLE `books` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`book` char(55) NOT NULL DEFAULT '',
`user_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `book` (`book`),
KEY `user_id` (`user_id`),
CONSTRAINT `books_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
因此,对于我的查询生成的列表中的每个 user_id,我还希望拥有来自 users 的 email。以及为该用户阅读的所有 book_ids,但这些 book_ids 是 ids,我希望它根据 book_ids 显示书籍中的书籍。
哇,有人能看懂我写的吗?
:L)
【问题讨论】:
-
只需加入您需要的任何表并从中选择所需的列
-
@wxyz just join 不够模糊,我对 sql 不是很熟悉 :) 我正在阅读...
-
@wxyz 我应该在哪里添加另一个连接?
-
@wxyz - 可怕的建议 --> 你有没有看过他的询问?它基于
HAVING逻辑子句。你不能只是JOIN -
@wxyz - 我们中的一个人不明白 OP 想要什么。他的第一个查询列出了至少有 5 本书共有的用户(user=1)。请求的解决方案需要有相同的用户和他们的电子邮件(此时没有额外的行)然后他们有共同的书籍,这将为每个用户增加至少 4 行 - 有效地将记录集的大小增加至少5x(至少根据我的理解)