2012-09-09 65 views
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 

現在我想加入到discudsComments表的memberid與discusTopic表的成員id(因爲我真正想要做的只是從特定的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 ; 
+0

表'discusComments'和'discusTopics'是否以'MemberID'之外的任何方式相互關聯?也許你使用的連接條件是錯誤的(或不完整)。 –

+0

你需要更多地解釋表格及其關係。我很清楚,每個'memberID'在'discusTopics'表中都有很多記錄。但爲什麼,那張桌子是什麼意思?它是什麼外鍵和獨特的限制。你提到該表有一個「groupID」字段。 'memberID,groupID'是唯一的嗎?如果是這樣,請在您選擇的「GROUP BY」中包含'groupID'並查看您得到的結果。 – MatBailie

+0

我剛剛添加了結構 – Jake

回答

0

您需要使用剛剛加入不LEFT JOIN,您可以discusTopics.memberID = 6 ON discusComments之後添加和。 memberID = discusTopicsmemberID

您可以使用子查詢LIK這個

SELECT `discusComments`.`memberID`, COUNT(`discusComments`.`memberID`) AS postcount 
FROM `discusComments` where `discusComments`.`memberID` in 
(select distinct memberid from `discusTopics` WHERE GROUPID = 6) 
+0

我仍然得到一個荒謬的大量postcount時加入 – Jake

+0

嘗試使用計數(獨特的'discusComments'.'memberID') – MichaelT

+0

剛剛發現,SQL以某種方式執行memberID出現在一個表中的次數乘以memberID出現在另一個表中的次數! – Jake

-1

如果我明白你的問題的權利,你不需要使用JOIN這裏都沒有。如果您有多對多關係,並且您需要爲一個表中的每個值選擇另一個表中的所有對應值,則需要JOIN。

但是在這裏你有多對一的關係,如果我說得對。然後,你可以根本就從兩個表中選擇這樣

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

這是簡單的請求,併爲加入過程

PS不會產生巨大的開銷:在未來嘗試用你的查詢進行試驗,嘗試避免JOIN,特別是在MySQL中。它們的複雜性很慢且很危險。對於90%的情況,當你想使用JOIN時,有一個簡單而快速的解決方案。

+1

你可能很好地理解了這個問題,但是你肯定對加入有一個誤解。你提到的開銷是多少?你是否意識到你的答案使用了一個連接,即使它不使用'JOIN'關鍵字? –

+0

@AndriyM它根本不使用JOIN。請參閱MySQL解釋器文檔以查看多種查詢如何工作。是的,JOIN在查詢上造成了很大的開銷。您可以嘗試通過創建(例如)10個JOIN與10個多項查詢的簡單PHP腳本。 – AlexKey

+0

即時加入 – Jake

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