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"
)
)