如何连接两个表而不会弄乱查询

时间:2012-09-09 19:13:19

标签: mysql sql

我有这个查询的例子(好的,它按照我想要的方式工作)

SELECT  `discusComments`.`memberID`, COUNT( `discusComments`.`memberID`) AS postcount 
FROM `discusComments`
GROUP BY  `discusComments`.`memberID` ORDER BY postcount DESC

示例结果:

memberid    postcount
3             283
6             230
9             198

现在我想加入discusComments表的memberid与discusTopic表的成员(因为我真正想做的只是从特定的GROUP获取我的结果,并且组ID仅在主题表中而不是在评论中因此加入。

SELECT  `discusComments`.`memberID`, COUNT( `discusComments`.`memberID`) AS postcount 
FROM `discusComments`
LEFT JOIN `discusTopics` ON `discusComments`.`memberID` =  `discusTopics`.`memberID`
GROUP BY  `discusComments`.`memberID` ORDER BY postcount DESC

示例结果:

memberid    postcount
3             14789
6              8678
9              6987

如何才能阻止postcount中发生的巨额增长?我需要像以前一样保留它。

一旦我对此进行了排序,我希望有一种代表WHERE discusTopics.groupID = 6的行,例如

CREATE TABLE IF NOT EXISTS `discusComments` (
  `id` bigint(255) NOT NULL auto_increment,
  `topicID` bigint(255) NOT NULL,
  `comment` text NOT NULL,
  `timeStamp` bigint(12) NOT NULL,
  `memberID` bigint(255) NOT NULL,
  `thumbsUp` int(15) NOT NULL default '0',
  `thumbsDown` int(15) NOT NULL default '0',
  `status` int(1) NOT NULL default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7190 ;

CREATE TABLE IF NOT EXISTS `discusTopics` (
  `id` bigint(255) NOT NULL auto_increment,
  `groupID` bigint(255) NOT NULL,
  `memberID` bigint(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `views` bigint(255) NOT NULL default '0',
  `lastUpdated` bigint(10) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `groupID` (`groupID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=913 ;

3 个答案:

答案 0 :(得分:1)

SELECT  `discusComments`.`memberID`, COUNT( `discusComments`.`memberID`) AS postcount 
FROM `discusComments`
JOIN `discusTopics` ON `discusComments`.`topicID` =  `discusTopics`.`id`
GROUP BY  `discusComments`.`memberID` ORDER BY postcount DESC

在两个表中加入topicid解决了memberID问题。谢谢@Andiry M

答案 1 :(得分:0)

你需要只使用JOIN而不是LEFT JOIN,你可以在ON discusComments之后添加AND discusTopics.memberID = 6. memberID = discusTopicsmemberID

你可以使用这个

的子查询
SELECT  `discusComments`.`memberID`, COUNT( `discusComments`.`memberID`) AS postcount 
FROM `discusComments` where `discusComments`.`memberID` in 
(select distinct  memberid from `discusTopics` WHERE GROUPID = 6)

答案 2 :(得分:-1)

如果我理解你的问题,你根本不需要在这里使用JOIN。如果您有多对多关系,并且您需要在一个表中选择每个值,则需要JOIN。选择另一个表中的所有相应值。

但是如果我做对了,你就会有多对一的关系。然后你可以简单地从这样的两个表中选择

SELECT a.*, b.id FROM a, b WHERE a.pid = b.id

这是一个简单的请求,不会像JOIN那样产生巨大的开销

PS:将来尝试尝试查询,尽量避免使用JOIN,特别是在MySQL中。它们的复杂性很慢且很危险。对于90%的情况,当您想使用JOIN时,可以使用简单且快速的解决方案。