Mysql select with 2 left join显示来自第二个left join的所有记录
我正在尝试获取已经阅读过的书籍(以及我链接到图书id的收藏)。我使用两个左连接 请参见下面的示例 我得到了这个结果: 我想获取此列表,但仅获取在“图书”子集合中阅读的收藏。在此结果中,它显示了所有集合的读取时间,并且输出仅为集合3 a_书籍 a_books_subcollection a_read 内容Mysql select with 2 left join显示来自第二个left join的所有记录,mysql,Mysql,我正在尝试获取已经阅读过的书籍(以及我链接到图书id的收藏)。我使用两个左连接 请参见下面的示例 我得到了这个结果: 我想获取此列表,但仅获取在“图书”子集合中阅读的收藏。在此结果中,它显示了所有集合的读取时间,并且输出仅为集合3 a_书籍 a_books_subcollection a_read 内容 CREATE TABLE `a_books_subcollection` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `l
CREATE TABLE `a_books_subcollection` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`label` varchar(35) DEFAULT NULL,
`book_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `a_books_subcollection` (`id`, `label`, `book_id`)
VALUES
(1,'Collection 1',3),
(2,'Collection 2',3),
(3,'Collection 3',3);
CREATE TABLE `a_read` (
`label` varchar(35) DEFAULT NULL,
`book_id` int(11) DEFAULT NULL,
`readtime` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `a_read` (`label`, `book_id`, `readtime`)
VALUES
('Story 1',1,'2020-09-09'),
('Collection 3',3,'2020-09-09');
CREATE TABLE `a_books` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`label` varchar(35) DEFAULT NULL,
`is_collection` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `a_books` (`id`, `label`, `is_collection`)
VALUES
(1,'story 1',NULL),
(2,'story 2',NULL),
(3,'story 3',1);
我的问题
SELECT a_books.* ,a_read.readtime,a_read.label
FROM a_books
LEFT JOIN a_books_subcollection
ON a_books_subcollection.book_id=a_books.id
LEFT JOIN a_read
ON a_books.id=a_read.book_id
ORDER BY a_books.id
也许这可以解决您的问题,但您希望从表
a_books\u subcollection
或a_read
中获取的字段标签
结果确实不明确。我添加了获取标签的条件,如果数据是来自表a\u books
是1
从表a\u books\u子集合
获取标签,则从表a\u read获取标签。这解决了读取时间问题,但第二个标签始终是“collection 3”@rosia这是您发布的结构问题(更准确地说,是缺少参考信息)。您的“我的查询”显示了相同的结果。将外键添加到DDL中。@rosia已编辑。检查表主要连接逻辑。我明白了。你将如何解决这个问题以形成一个良好的结构?@rosia书籍和藏书之间的关系(据我所知)似乎是M:N(每本书可能属于许多藏书,每本藏书可能包含许多书籍)。如果是这样的话,那么您必须为书籍和藏书设置单独的表,以及存储每个单独的书籍和本书所属的每个单独的藏书之间的链接的附加表。有一个疑问。因此,代码片段-1就是您得到的结果。但是您希望得到代码片段2中显示的结果。我认为您的表设计缺少一些东西。我的建议合并了表a_books和a_books子集合。这两个标签背后的原因是用唯一的数字标识的。所以你很容易就能把它们弄出来。否则,您必须为此编写过程。比如标签的IF-ELSE条件。
SELECT b.id,
b.label book_label,
b.is_collection,
r.readtime,
COALESCE(bs.label, b.label) label
FROM a_books b
LEFT JOIN a_books_subcollection bs ON bs.book_id=b.id
LEFT JOIN a_read r ON r.book_id = b.id AND r.label IN (b.label, bs.label)
ORDER BY id, label
SELECT a.*,c.readtime ,IF(a.is_collection=1,b.label,c.label)
FROM a_books a
LEFT JOIN a_books_subcollection b ON b.book_id=a.id
LEFT JOIN a_read c on c.book_id=a.id and (c.label=b.label or c.label=a.label)
ORDER BY a.id,b.label