【问题标题】:MySQL Join and Count queryMySQL 加入和计数查询
【发布时间】:2012-06-18 14:55:42
【问题描述】:

我有两个 MySQL 表,结构如下;

广告

+-------------------+--------------+
| Field             | Type         |
+-------------------+--------------+
| id                | int(11)      |
| title             | varchar(150) |
+-------------------+--------------+

advert_interest_record

+--------------+------------+
| Field        | Type       |
+--------------+------------+
| id           | int(11)    | 
| advert_id    | int(11)    |
| message      | longtext   |
+--------------+------------+

我想从“advert”表中选择所有记录的列表 - 并从 advert.id=response.advert_id 的“advert_interest_record”表中获取行数。

我用来连接表的 SQL 如下;

SELECT advert.id, advert.title 
FROM advert 
LEFT JOIN advert_interest_record ON advert.id = advert_interest_record.advert_id  
GROUP BY advert_interest_record.advert_id 

我遇到的第一个问题是,当“advert_interest_record”表中没有记录时,“advert”表中的记录不包含在结果中 - 我需要它。

我的第二个问题是,我将如何计算“advert_interest_record”表中的行数?

对此的任何建议将不胜感激。

谢谢。

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    首先;您正在从广告表中选择两个字段;同时从 advert_interest_record 表中搜索一个字段。

    假设对于所有的 advert.id 值,advert.title 的值是相同的,它可能会给出正确的结果。

    无论如何;由于您希望广告中的数据处于领先地位,因此最好对您希望唯一返回的该表的字段进行分组(这也有助于获取与另一个表中的记录相关联的记录数)。

    例如,您可以查询如下:

    SELECT a.id, a.title, COUNT(air.id)
    FROM advert a
    LEFT JOIN advert_interest_records air ON a.id = air.advert_id
    GROUP BY a.id, a.title
    

    这将为您提供 advert.id 和 advert.title 的所有唯一组合的结果,以及 advert_interest_records 中与 advert.id 值关联的记录数。

    我假设 advert.id 是唯一的,并且每个 id 只出现一次。否则,对 id 和 title 进行分组(我相信,与其他 DBMS 相比,MySQL 本身不需要),可能会给你不正确的结果。

    【讨论】:

    • 抱歉,当第一个(id)应该是唯一的时,您能解释一下按两个字段分组的意义吗?
    • 正如我在回答中所说,我认为 MySQL 不需要这样做。但是,其他 DBMS 在选择不在组聚合中的字段时会出错。我没有直接在这里运行 MySQL 实例。所以我选择了最安全的路线:)。
    • 好吧,我想我已经太习惯使用 MySQL 了,而这并不是必需的。 ) +1 供您解释。
    【解决方案2】:

    这个怎么样:

       SELECT a.title, COUNT(air.id) 
         FROM advert a 
    LEFT JOIN advert_interest_record air
           ON a.id = air.advert_id
        GROUP BY a.id
    

    LEFT JOIN 应该保证advert 表中的所有记录都将包含在最终结果中。

    【讨论】:

      【解决方案3】:

      改为按 advert.id 分组,并使用 count() 来计算您的记录。

      没有 advert_interest_record 的广告应该返回一个 count() 等于 0。

      SELECT advert.id, count(advert_interest_record.id) as interestcount
        FROM advert 
        LEFT JOIN advert_interest_record ON advert.id = advert_interest_record.advert_id  
      GROUP BY advert.id;
      

      【讨论】:

        【解决方案4】:
        SELECT advert.id, advert.title, count(*) as totalRows 
        FROM advert 
        LEFT JOIN 
                 advert_interest_record ON advert.id = advert_interest_record.advert_id  
        GROUP BY advert.id, advert.title 
        

        关于查询的一些说明

        1. GROUP BY advert_interest_record.advert_id 来自您的原始查询。你group by 一个不在SELECT 中的字段。这会导致您的问题
        2. 某些 DBMS 要求所有 group by 字段也必须存在于 SELECT 字段中

        【讨论】:

        • 如果两个表都有id 列,这会被削弱。另外,我不确定你为什么在advert.id 已经存在时将id 添加到SELECT 中。
        • @Dems 我没注意到这是以前的 id 用于 SELECT
        猜你喜欢
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        • 2016-03-05
        相关资源
        最近更新 更多