2

我有下面的 SQL 查询:

SELECT message, sent_date, user_id
FROM messages
LEFT JOIN numbers ON messages.from_id = numbers.id

它返回表中的所有行(大约 4000 行)以及来自messages表的附加列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 ;
4

5 回答 5

2

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

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;

同样对于您的情况,请确保两者之间没有其他插入或更新。否则使用事务。

于 2012-08-09T10:12:43.823 回答
1

table1 有时没有用户 ID - 所以它会为空,所以这些结果会丢失吗?

于 2012-08-09T10:07:00.643 回答
0

试试这个,我认为这是user_id.

SELECT table1.message, table1.sent_date 
FROM ( 
    SELECT messages.message, messages.sent_date, numbers.user_id 
    FROM messages 
    LEFT JOIN numbers ON messages.from_id = numbers.id 
) AS table1 
LEFT JOIN users ON table1.user_id = users.id 

我不确定user_id是 inmessages还是numbers.

于 2012-08-09T10:15:39.750 回答
0

我对你的问题没有确切的答案,但是如果我必须开始思考,我会首先找出缺少的 3800 行并尝试查看模式(是因为 user_id 为空还是重复)

SELECT message, sent_date, user_id
FROM messages
LEFT JOIN numbers ON messages.from_id = numbers.id
MINUS
(SELECT table1.message, table1.sent_date, table1.user_id
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)
于 2012-08-09T10:29:04.883 回答
0

这不可能发生。

试试这个变化:

SELECT 
    m.message, m.sent_date, n.user_id
FROM
    messages m
  LEFT JOIN 
    numbers AS n  ON m.from_id = n.id
  LEFT JOIN 
    users AS u  ON n.user_id = u.id ;
于 2012-08-09T11:28:23.320 回答