假设您有一个名为“公司”的表格,其中包含以下字段: Company_id ,名称,您想要打印出所有内容在此表格中,您还有另一个名为电子邮件的表格,其中包含以下字段: data_key , data_value , company_id 。现在请记住,你想要在公司下面打印所有东西,但是还要添加他们是否有电子邮件 - 现在如果我写了
Where data_key = email
由于我不想从电子邮件中获取任何不必要的数据 - 一个WHERE子句似乎可以正常工作,但它会丢弃所有没有data_key =的电子邮件数据,这是我想要的,但仅限于电子邮件表不是公司表
有什么方法可以解决这个问题 即使是一个小小的暗示,我也会感激。
非常感谢:)
答案 0 :(得分:1)
子查询将成为你的朋友:
select c.*,
(select count(*) from emails e where c.company_id = e.company_id) as email_count
from companies c
这将返回公司的所有内容,以及该公司的电子邮件数量。
或者如果你讨厌子查询:
select c.*, count(e.data_key) as email_count
from companies c
left join emails e on company_id
group by c.company_id
group by使左连接不会为每个公司返回多个电子邮件行。
答案 1 :(得分:0)
但是还要添加他们是否有电子邮件
我还没有看到你的dbschema,但你可以加入包含你的电子邮件的表,并使用if语句定义一个布尔列来显示他们是否有电子邮件:
SELECT
IF(Emails.data_key IS NULL, 0, 1) as has_email
, Companies.*
FROM Companies
LEFT JOIN Emails ON (Emails.company_id = Companies.Company_id)
答案 2 :(得分:0)
您可能不想要left join
,因为这会引入额外的行(如果有多个电子邮件)。你可以使用select distinct
解决这个问题。
以下是嵌套选择的另一种方法:
select c.*,
(case when exists (select 1 from emails e on e.company_id = c.company_id and e.data_key = 'email'
then 'Yes'
else 'No'
end) as HasEmails
from companies c;