mysql - LEFT JOIN 无法按预期使用子查询

标签 mysql sql subquery left-join

我得到了下面的 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 ;

最佳答案

您可以尝试其他方法来调试问题:

CREATE TEMPORARY table tmp1 AS SELECT message, sent_date, user_id
                               FROM messages
                                    LEFT JOIN numbers 
                                        ON messages. from_id = numbers.id;

然后看看这个查询是否有效。

 SELECT message, sent_date
 FROM tmp1 table1
      LEFT JOIN users 
          ON table1.user_id = users.id;

另外,对于您的情况,请确保其间没有其他插入或更新。否则使用事务。

关于mysql - LEFT JOIN 无法按预期使用子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11881001/

相关文章:

php - 根据两个 MySQL 表计算出时间戳/其他数据

mysql - 触发语法问题

php - MySQL 获取最后一条消息 (VarChar)

mysql - 子查询。获取每个用户的附加条件

MySQL子查询仍然产生双SUM值

php - 在数据库中存储 PHP session 数据的最佳实践是什么?

mysql从3个表中计数

mysql - 按 MYSQL 性能分组

mysql:如何在LEFT JOIN后保存ORDER BY而不重新排序?

mySQL - 如何展平记录和子记录