【发布时间】:2012-08-09 10:05:08
【问题描述】:
我有下面的 SQL 查询:
SELECT message, sent_date, user_id
FROM messages
LEFT JOIN numbers ON messages.from_id = numbers.id
它返回messages 表中的所有行(大约4000 行)以及来自numbers 表的其他列。到目前为止,这是我所期望的。
现在我将这个子查询左连接到另一个表,再次使用左连接:
SELECT message, sent_date
FROM (
SELECT message, sent_date, user_id
FROM messages
LEFT JOIN numbers ON messages.from_id = numbers.id
) AS table1
LEFT JOIN users ON table1.user_id = users.id
但是,它只返回大约 200 行,所以很多都丢失了。由于这是一个左连接,我希望 table1 中的所有行都在结果中。有人能看出是什么问题吗?
编辑:
因此,这里有 3 个相关表(删除了不相关的列)以供参考:
CREATE TABLE IF NOT EXISTS `messages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`message` text CHARACTER SET utf8 NOT NULL,
`from_id` int(11) DEFAULT NULL,
`sent_date` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `from_id` (`from_id`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=101553 ;
CREATE TABLE IF NOT EXISTS `numbers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`number` varchar(32) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6408 ;
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(256) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2395 ;
【问题讨论】:
-
user_id在表messages中吗? -
您在最后一个查询中是否有
WHERE,但您没有包含在问题中? -
是否有可能在其他连接之间删除或更新了表中的某些行?
-
@ypercube,user_id 在表中
numbers。 -
@ypercube,最后一个查询中没有
WHERE。
标签: mysql sql subquery left-join