0

たとえば、このクエリがあります(良い、私が望むように機能します)

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テーブルのメンバーIDをdiscusTopicテーブルのメンバーIDに結合します(私が本当にやりたいのは、特定のGROUPからの結果のみを取得することであり、グループIDはトピックテーブルにのみ存在し、コメントには存在しないためです。したがって、1つは結合します。

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

ポストカウントで発生するこの大幅な増加をどのように止めることができますか?以前と同じように保存する必要があります。

これを並べ替えたら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 ;
4

3 に答える 3

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

于 2012-09-09T20:53:21.027 に答える
0

LEFT JOINではなくJOINのみを使用する必要があり、ONの後にAND discusTopics.memberID=6を追加できますdiscusCommentsmemberID= discusTopicsmemberID

このようなサブクエリを使用できます

SELECT  `discusComments`.`memberID`, COUNT( `discusComments`.`memberID`) AS postcount 
FROM `discusComments` where `discusComments`.`memberID` in 
(select distinct  memberid from `discusTopics` WHERE GROUPID = 6)
于 2012-09-09T19:18:58.300 に答える
-1

私があなたの質問を正しく理解していれば、ここでJOINを使用する必要はまったくありません。JOINは、多対多の関係があり、あるテーブルの各値に対して、別のテーブルの対応するすべての値を選択する必要がある場合に必要です。

しかし、私がそれを正しく理解した場合、ここでは多くの対1の関係があります。次に、このように2つのテーブルから選択するだけです。

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

これは単純なリクエストであり、JOINのように大きなオーバーヘッドが発生することはありません。

PS:将来的には、クエリを試してみてください。特にMySQLではJOINを避けてください。それらは複雑で遅く危険です。JOINを使用する場合の90%には、シンプルではるかに高速なソリューションがあります。

于 2012-09-09T19:20:37.450 に答える