0

次のように構成された2つの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」テーブルのレコードが結果に含まれないことです。これが必要です。

2番目の質問は、「advert_interest_record」テーブルの行をカウントするにはどうすればよいですか。

これに関するアドバイスをいただければ幸いです。

ありがとう。

4

4 に答える 4

3

初めに; 広告テーブルから2つのフィールドを選択しています。advert_interest_recordテーブルの1つのフィールドを調べている間。

すべての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.id値に関連付けられているadvert_interest_records内のレコードの数が得られます。

advert.idは一意であり、すべてのIDは1回だけ発生すると想定しています。そうしないと、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

advertLEFT JOINは、テーブルのすべてのレコードが最終結果に含まれることを保証する必要があります。

于 2012-06-15T14:17:18.817 に答える
1

代わりにadvert.idでグループ化し、count()を使用してレコードをカウントします。

advert_interest_recordがない広告は、ゼロに等しいcount()を返す必要があります。

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 に答える