2012-05-07 18 views
1

複数のテーブルからデータを選択しようとしましたが、左結合で結合した追加テーブルのIDをソートします。すべては、カウントが各行ごとに1つではなく600somethingで増やされることを除いて、素晴らしいことです。MySQL複数のテーブルから選択します。左結合テーブルの数で順序付けします。

同様の問題でcount文の中に別のものを入れてみましたが、データベースをフリーズした唯一の結果が出ました。

テーブル:

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

ON句がないため、一見して、あなたはpdとpにクロス結合している可能性があります。場所の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 
関連する問題