计算左连接中不同的特定右列的数量

时间:2014-10-16 18:04:11

标签: mysql join distinct

鉴于以下两个表:



<div style="float:left;width:48%;">
<label>Table1</label>
<table>
  <thead style="background:green;">
    <tr>
      <th>ID</th>
      <th>Name</th>
    </tr>
  </thead>
  <tbody style="background:yellow;">
    <tr>
      <td>1</td>
      <td>Apple</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Orange</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Banana</td>
    </tr>
  </tbody>
</table>
</div>
<div style="float:left;width:48%;">
  <label>Table2</label>
<table>
  <thead style="background:green;">
    <tr>
      <th>t1ID</th>
      <th>Color</th>
    </tr>
  </thead>
  <tbody style="background:yellow;">
    <tr>
      <td>1</td>
      <td>Red</td>
    </tr>
    <tr>
      <td>1</td>
      <td>Green</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Yellow</td>
    </tr>
    <tr>
      <td>1</td>
      <td>Red</td>
    </tr>
  </tbody>
</table>
</div>
&#13;
&#13;
&#13;

我正在尝试创建一个包含不同匹配项的连接。

所以我正在寻找这样的结果集:

&#13;
&#13;
<label>Results</label>
<table>
  <thead style="background:green;">
    <tr>
      <th>ID</th>
      <th>Name</th>
      <th>ColorCount</th>
    </tr>
  </thead>
  <tbody style="background:yellow;">
    <tr>
      <td>1</td>
      <td>Apple</td>
      <td>2</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Orange</td>
      <td>0</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Banana</td>
      <td>1</td>
    </tr>
  </tbody>
</table>
&#13;
&#13;
&#13;

我的基本查询是:

SELECT Table1.ID, Table1.Name, COUNT(DISTINCT Table2.Color) AS ColorCount FROM
Table1 LEFT JOIN Table2 ON Table1.ID=Table2.t1ID

但是这只返回一行数据,如:

1    Apple    3

以上是计算所有不同颜色,而不是2红色(1)和1绿色(1)(1 + 1)= 2;

看来,distinct是强制查询区分Table2中的所有值,而不是那些与连接条件匹配的值。我在这里砰的一声。考虑到我的最终目标,我绝对可以使用子查询实现这一目标,但如果我不需要与联接一起使用它们,那就太棒了。

干杯

1 个答案:

答案 0 :(得分:1)

您可以使用GROUP BYLEFT JOIN

SELECT ID , T1.Name, COUNT(DISTINCT T2.Color) as ColorCount
FROM Table1 T1
LEFT JOIN Table2 T2
ON T1.ID = T2.t1ID
GROUP BY ID,T1.NAME