MySQL加入这里是最好的选择吗? 活动: 服务:

MySQL加入这里是最好的选择吗? 活动: 服务:,mysql,sql,Mysql,Sql,查询结果应显示: campaigns_id campaigns_name cap count 1 Campaign1 2 2 2 Campaign2 1 1 3 Campaign3 1 0 我正在使用此查询: SELECT served.id_campaign,

查询结果应显示:

campaigns_id    campaigns_name          cap    count
1               Campaign1               2      2
2               Campaign2               1      1
3               Campaign3               1      0
我正在使用此查询:

   SELECT served.id_campaign, 
          campaigns.name, 
          campaigns.cap, 
          COUNT( served.id ) AS count
     FROM campaigns
LEFT JOIN served ON campaigns.id = served.id_campaign
    WHERE served.ip =  '127.0.0.1' 
 GROUP BY served.id_campaign
我的查询显示这些结果不正确,没有显示活动id。3:

campaigns_id    campaigns_name          cap    count
1               Campaign1               2      2
2               Campaign2               1      1

如果我想包含WHERE语句未选择的值,我认为我的做法是错误的,因为服务中没有与活动的WHERE语句匹配的记录。id='3'

LEFT JOIN表示从左侧表中获取所有记录,并从右侧表中获取匹配的记录。因此,从id=3开始,served.ip将为NULL。 因此,更改where条件以使其

WHERE serverd.ip = '127.0.0.1' or serverd.ip IS NULL

将where子句更改为

WHERE served.ip =  '127.0.0.1' OR served.ip IS NULL
新编辑:

   SELECT campaigns.id as id_campaign, 
          campaigns.name, 
          campaigns.cap, 
          COUNT( served.id ) AS count
     FROM campaigns
LEFT JOIN served ON campaigns.id = served.id_campaign
      AND served.ip =  '127.0.0.1' 
 GROUP BY campaigns.id
旧职位:

我提出了这个查询,它生成您想要的结果:

(SELECT served.id_campaign, 
          campaigns.name, 
          campaigns.cap, 
          COUNT( served.id ) AS count
     FROM campaigns
LEFT JOIN served ON campaigns.id = served.id_campaign
    WHERE served.ip =  '127.0.0.1' 
 GROUP BY served.id_campaign)

UNION

(SELECT id, name, cap, 0 as count 
FROM campaigns 
WHERE id <> ALL 
     (
      SELECT campaigns.id 
      FROM campaigns, served 
      WHERE campaigns.id = served.id_campaign AND served.ip = "127.0.0.1"
     )
)

正如您可以从输出中看到的,我希望下面的输出显示查询结果,我希望包含id 3的结果。LEFT JOIN和JOIN在这里返回相同的输出。哦,对不起,我刚才跳过了它。请尝试此served.ip='127.0.0.1'或served.ip为空。它工作的原因是resultset中的served.ip将为空或null。希望有帮助。我不能这样做,因为我需要从服务中选择与特定IP匹配的记录。这样做本质上就是做一个WHERE 1=1语句。不,不是。基本上是说,如果服务器IP为“127.0.0.1”或未设置服务器IP,则只显示记录。它将排除所有其他IP。我明白你的意思。我误解了答案。这将不起作用,因为始终存在served.ip的值,并且由于served中没有关联行,因此缺少活动中缺少的行。这起作用,但加载查询花费了26秒。有超过300000行。也许有一种方法可以执行查询,而不必通过服务查询两次。这是安德烈M.的更正查询。我认为应该可以,它只查询了一次服务的表。享受我认为在选择列表中将served.id_活动替换为campaiments.id是个好主意。您的新查询现在似乎只需要一个更正:GROUPBY子句可能应该是GROUPBY MAVICES.id。更新:我冒昧地编辑了你的文章。如果您不同意,请随时回滚更改。
   SELECT campaigns.id as id_campaign, 
          campaigns.name, 
          campaigns.cap, 
          COUNT( served.id ) AS count
     FROM campaigns
LEFT JOIN served ON campaigns.id = served.id_campaign
      AND served.ip =  '127.0.0.1' 
 GROUP BY campaigns.id
(SELECT served.id_campaign, 
          campaigns.name, 
          campaigns.cap, 
          COUNT( served.id ) AS count
     FROM campaigns
LEFT JOIN served ON campaigns.id = served.id_campaign
    WHERE served.ip =  '127.0.0.1' 
 GROUP BY served.id_campaign)

UNION

(SELECT id, name, cap, 0 as count 
FROM campaigns 
WHERE id <> ALL 
     (
      SELECT campaigns.id 
      FROM campaigns, served 
      WHERE campaigns.id = served.id_campaign AND served.ip = "127.0.0.1"
     )
)