2014-12-23 152 views
2

我在下面的表格结构LEFT JOIN与多个条件

CREATE TABLE IF NOT EXISTS `review_author` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) NOT NULL, 
    `email` varchar(255) NOT NULL, 
    `client_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `IDX_37D99F0819EB6921` (`client_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2110 ; 

CREATE TABLE IF NOT EXISTS `brokers_comments` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `hb_broker_id` int(11) NOT NULL, 
    `client_id` int(11) DEFAULT NULL, 
    `user_name` varchar(100) NOT NULL, 
    `user_email` varchar(100) NOT NULL, 
    `state` int(11) NOT NULL DEFAULT '0', 
    `text` varchar(3000) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `IDX_5365DFFB9FE55EF7` (`hb_broker_id`), 
    KEY `IDX_5365DFFB19EB6921` (`client_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1583 ; 

提取价值之前,我没有下面的查询:

INSERT INTO review_author (
        name, 
        email, 
        client_id 
       ) 
       SELECT 
        brokers_comments.user_name, 
        brokers_comments.user_email, 
        brokers_comments.client_id 
       FROM brokers_comments 
       LEFT JOIN review_author 
       ON brokers_comments.user_name=review_author.name AND 
       brokers_comments.user_email=review_author.email AND 
       brokers_comments.client_id=review_author.client_id 
       WHERE review_author.id IS NULL 

不在REVIEW_AUTHOR应来自表brokers_comments的所有作者,现在我试图使用以下查询获取作者ID:

SELECT 
    review_author.id 
FROM brokers_comments 
LEFT JOIN review_author 
    ON brokers_comments.user_name=review_author.name AND 
    brokers_comments.user_email=review_author.email AND 
    brokers_comments.client_id=review_author.client_id 
WHERE review_author.id IS NOT NULL 

但我从表brokers_comments总共1531条记录中获得约110条结果。

UPDATE

我无法管理http://sqlfiddle.com/插入数据,所以下面的链接是两个表REVIEW_AUTHORbrokers_comments转储。

同样我的问题是将不同的列(user_name,user_email,client_id)从表brokers_comments转移到表review_author,然后根据两个表中的关系名/ email/client_id选择review_author.id。

http://wrttn.in/7ca325 http://wrttn.in/3a7885

插入新的作者是错的,做重复。以下是新的正确形式。

INSERT INTO review_author (
        name, 
        email, 
        client_id 
       ) 
       SELECT user_name, user_email, client_id 
       FROM brokers_comments AS broker 
       WHERE NOT EXISTS 
         (
         SELECT 1 
         FROM review_author AS author 
         WHERE author.email = broker.user_email 
         ) 
       GROUP BY broker.user_email 

P.S.我有人会做一个在线mysql数据库,请放在评论,所以我可以把它放在那里。

已解决 只有现在我意识到user_email必须是唯一的。在此基础上我做了以下的select语句:

SELECT 
    author.id 
FROM brokers_comments AS broker 
LEFT JOIN review_author AS author 
ON broker.user_email = author.email 
+0

第一件事,你尝试过了'SELECT COUNT(*)FROM review_author',以确保你有正确的记录数?第二件事,如果你不插入查询是错误的,你将需要改变它。第三件事你可以发布一个sqlfiddle的一些相关信息供我们测试吗? –

+0

您能否显示一小组示例数据和预期结果来描述哪些不起作用? – AdamMc331

+0

@ McAdam331在**更新**部分详细信息中添加。 – Igor

回答

1

看来你使用JOIN子句多余的字段,因为CLIENT_ID是一个关键,你需要连接表只有在这个领域。您获得不同的记录数的可能原因是这两个表中相同的client_id的名称/电子邮件不同。所以,你的两个查询应该是这样的:

INSERT INTO review_author (
        name, 
        email, 
        client_id 
       ) 
       SELECT 
        brokers_comments.user_name, 
        brokers_comments.user_email, 
        brokers_comments.client_id 
       FROM brokers_comments 
       LEFT JOIN review_author 
       ON brokers_comments.client_id=review_author.client_id 
       WHERE review_author.id IS NULL 

SELECT 
    review_author.id 
FROM brokers_comments 
LEFT JOIN review_author 
    ON brokers_comments.client_id=review_author.client_id 
WHERE review_author.id IS NOT NULL 
+0

它认为你的插入与我检查select语句是一样的,它返回相同的行。第二个select语句也返回错误的行数。 – Igor

+0

你提出的问题越好,答案越接近。尽量缩短输入数据,保持错误出现:目标应该是大约5个重现原始错误的记录。然后您可以自己查看原因,或者将此示例数据放在此处并快速得到答案 –

+0

我已将放在我的'update'部分链接中的这两个表的转储位置放在哪里。 – Igor