1

複数のテーブルからデータを選択しようとしていますが、左結合で結合した追加のテーブルの ID の数で並べ替えています。カウントが行ごとに 1 つではなく 600 でインクリメントされることを除いて、すべてがうまく機能します。

同様の問題で見たように、countステートメント内にdistinctを入れようとしましたが、結果はデー​​タベースをフリーズするだけでした。

テーブル:

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

何か案は?ありがとうございました!

4

1 に答える 1

0

一見したところ、ON 句がないため、pd と p をクロス結合していることが問題である可能性があります。where の 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 
于 2012-06-14T22:24:44.300 に答える