0

我有两个结构如下的 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_interest_record”表中获取行数,其中 advert.id=response.advert_id。

我用来连接表的 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”表中的行数?

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

谢谢。

4

4 回答 4

3

首先; 您正在从广告表中选择两个字段;同时从 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 本身不需要),可能会给你不正确的结果。

于 2012-06-15T14:19:16.703 回答
1

这个怎么样:

   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表中的所有记录都将包含在最终结果中。

于 2012-06-15T14:17:18.817 回答
1

而是按 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;
于 2012-06-15T14:30:02.673 回答
0
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
于 2012-06-15T14:17:02.797 回答