是否可以使用WHERE语法限制数据,但仅限于一个字段而不是整个SQL语句

时间:2013-12-11 19:38:03

标签: php mysql sql sql-server

假设您有一个名为“公司”的表格,其中包含以下字段: Company_id 名称,您想要打印出所有内容在此表格中,您还有另一个名为电子邮件的表格,其中包含以下字段: data_key data_value company_id 。现在请记住,你想要在公司下面打印所有东西,但是还要添加他们是否有电子邮件 - 现在如果我写了

Where data_key = email

由于我不想从电子邮件中获取任何不必要的数据 - 一个WHERE子句似乎可以正常工作,但它会丢弃所有没有data_key =的电子邮件数据,这是我想要的,但仅限于电子邮件表不是公司表

有什么方法可以解决这个问题 即使是一个小小的暗示,我也会感激。

非常感谢:)

3 个答案:

答案 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;