【问题标题】:MySQL Select from multiple tables ordered by count of left joined tableMySQL 从多个按左连接表计数排序的表中选择
【发布时间】:2012-05-15 14:57:49
【问题描述】:

我一直在尝试从多个表中选择数据,而我通过左连接加入的另一个表中的 id 计数进行排序。一切都很好,只是计数增加了 600something 而不是每行一个。

正如我在类似问题中看到的那样,我尝试将 distinct 放在 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

有什么想法吗?谢谢!

【问题讨论】:

  • 我什至无法运行此查询:sqlfiddle.com/#!2/88491/1 请修复错误?
  • 仍然损坏:sqlfiddle.com/#!2/88491/4 如果需要,您可以使用该 SQL Fiddle 示例进行调试。
  • @PaulBellora 现在它基于您设置的第一个创建表工作。对不起,谢谢你
  • 实际上,您可以发布这些实际表格的详细信息吗?我的 SQL Fiddle 示例中的表只是让查询运行的快速丢弃物,但它们实际上没有意义,例如相互引用的主键。抱歉不是故意让你感到困惑。
  • 就是这样,感谢您的调查

标签: mysql join count


【解决方案1】:

乍一看,您的问题可能是您正在交叉连接 pd 和 p,因为没有 ON 子句。 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 

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2018-03-30
    • 2013-10-11
    • 1970-01-01
    • 2012-07-16
    相关资源
    最近更新 更多