MySQL从一个表中查询GROUPing,排除在另一个子查询中找到的结果

时间:2012-11-01 06:11:51

标签: mysql group-by subquery not-exists

我们说我有两张桌子 - ADDONS和DOWNLOADS。

ADDONS规定哪些应用程序免费提供哪些插件 DOWNLOADS记录来自所有应用程序的插件下载,这些应用程序是免费提供的,而不是。

ADDONS  
appname  | varchar  
appaddon | varchar

DOWNLOADS  
id       | int  
appaddon | varchar  
appname  | varchar  
source   | varchar  
date     | datetime  

我正在尝试编写一个查询,显示每个appaddon在DOWNLOADS中的计数,其中ADDONS中没有免费提供。

我得到了"SELECT appaddon, count(id) FROM downloads GROUP BY appaddon ORDER BY count(id) DESC" - 但这包括免费包含的应用和不包含它的应用。

有人能指出我正确的方向吗?


更新:

示例:想象一下,我有两个假日主题应用程序 - 一个用于圣诞节,一个用于万圣节,每个应用程序允许您下载应用程序附带的服装(例如万圣节让您下载女巫,骨架或杰克灯笼,圣诞节让你下载圣诞老人或精灵)。但是如果有人从应用程序内升级,他们可以下载任何可用的服装(因此圣诞节升级可以下载骨架,或万圣节升级可以下载精灵)。

我正在尝试计算未升级时未包含的下载量。所以我想排除万圣节下载的女巫和圣诞节下载的圣诞老人,但要计算其他应用程序下载的女巫,骷髅,精灵等。

以下是一些示例数据:

ADDONS  
appname     | appaddon  
========================  
halloween   | jackolantern  
halloween   | skeleton  
halloween   | witch  
christmas   | santa  
christmas   | elf  
christmas   | reindeer  
easter      | bunny  
allholidays | bunny

DOWNLOADS  
id | appaddon  | appname   | date  
=======================================
1  | skeleton  | halloween | 2012-10-15  
2  | skeleton  | halloween | 2012-10-15  
3  | witch     | halloween | 2012-10-16  
4  | santa     | christmas | 2012-10-16  
5  | elf       | christmas | 2012-10-16  
6  | witch     | christmas | 2012-10-16  
7  | bunny     | christmas | 2012-10-16  
8  | bunny     | halloween | 2012-10-17  
9  | bunny     | easter    | 2012-10-18

基于以上所述,我期待结果:

appaddon  | count
=================
bunny     | 2
witch     | 1

3 个答案:

答案 0 :(得分:3)

 SELECT appaddon, count(id) FROM downloads 
    left join addons on addons.appname=downloads.appname
    where addons.appname is null
    GROUP BY downloads.appaddon ORDER BY count(id) DESC

答案 1 :(得分:2)

这可能对您有用:

SELECT DOWNLOADS.appaddon, COUNT(*) FROM DOWNLOADS
    INNER JOIN ADDONS ON (DOWNLOADS.appaddon = ADDONS.appaddon)
    WHERE DOWNLOADS.appname != ADDONS.appname
    GROUP BY DOWNLOADS.appaddon;

以下是SQL小提琴:link

答案 2 :(得分:1)

我想出来了!要求我使用WHERE NOT EXISTS。

SELECT appaddon, count(id) FROM DOWNLOADS
WHERE NOT EXISTS (
  SELECT appaddon FROM ADDONS
  WHERE DOWNLOADS.appname = ADDONS.appname
  AND DOWNLOADS.appaddon = ADDONS.appaddon)
GROUP BY appaddon

Fiddler for it here