2012-05-07 49 views
1

我一直在嘗試從多個表中選擇數據,而我按照已加入左連接的附加表中的ID的數量進行排序。一切都很好,除非計數增加了600個,而不是每行增加一個。MySQL從左表加入的多個表中選擇

我試過,因爲我在類似的問題中看到把計數語句內的不同內容,但凍結數據庫的唯一結果。

表:

CREATE TABLE IF NOT EXISTS `places` (
    `PlaceId` int(10) NOT NULL AUTO_INCREMENT, 
    `Name` varchar(45) COLLATE utf8_unicode_ci NOT NULL, 
    `AreaId` int(10) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`PlaceId`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0; 

CREATE TABLE IF NOT EXISTS `places_descriptions` (
    `DescId` int(45) NOT NULL AUTO_INCREMENT, 
    `PlaceId` int(10) NOT NULL, 
    `Description` varchar(1024) COLLATE utf8_unicode_ci DEFAULT NULL, 
    PRIMARY KEY (`DescId`), 
    KEY `PlaceId` (`PlaceId`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0; 

CREATE TABLE IF NOT EXISTS `places_hits` (
    `HitId` int(45) NOT NULL AUTO_INCREMENT, 
    `PlaceId` int(45) NOT NULL, 
    PRIMARY KEY (`HitId`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0; 

查詢:

SELECT 
    p.PlaceId, 
    p.Name, 
    pd.Description, 
    COUNT(ph.HitId) AS numHits 
FROM 
    places_descriptions AS pd, 
    places AS p 
    LEFT JOIN places_hits AS ph 
    ON (p.PlaceId = ph.PlaceId) 
WHERE 
    (p.PlaceId = pd.PlaceId) AND 
    (p.AreaId = 1) 
GROUP BY 
    p.PlaceId, 
    p.Name, 
    pd.Description 
ORDER BY 
    numHits DESC, 
    p.PlaceId 
LIMIT 0, 10 

任何想法?謝謝!

+2

我連這樣的語句來運行:http://sqlfiddle.com/#!2/88491/1請修正錯誤? –

+1

仍然損壞:http://sqlfiddle.com/#!2/88491/4如果需要,可以使用該SQL Fiddle示例進行調試。 –

+0

@PaulBellora現在它的工作基於您設置的第一個創建表。對不起,謝謝 – lpetren

回答

0

乍一看,您的問題可能是您交叉連接pd和p,因爲沒有ON子句。 placeId = placeId通過篩選出連接不準確的行來屏蔽此問題,但最好將該條件放在ON中。在過濾之前實際存在的大量行可能會拋出計數,儘管我不確定。

試試這個,開始:

SELECT 
    p.PlaceId, 
    p.Name, 
    pd.Description, 
    COUNT(ph.HitId) AS numHits 
FROM 
    places_descriptions AS pd 
    INNER JOIN places AS p 
      ON p.PlaceId = pd.PlaceID 
    LEFT JOIN places_hits AS ph 
    ON (p.PlaceId = ph.PlaceId) 
WHERE 
    (p.AreaId = 1) 
GROUP BY 
    p.PlaceId, 
    p.Name, 
    pd.Description 
ORDER BY 
    numHits DESC, 
    p.PlaceId