2013-02-25 52 views
0

我有了这种结构的表格:回报是,如果只有一条记录被发现

table 
id  | site_id 
------------------- 
240  | 1 
240  | 2 
240  | 3 
320  | 1 
320  | 2 
421  | 1 
520  | 2 
------------------- 

300K记录

我现在想编写一个查询返回一个是或否的每个记录(id)。

例如,如果与ID记录240 只有有SITE_ID 1然后返回“是”,如果它有2个,3等回报“否”

我不知道如何处理它但这里是一个结果示例:

result_table 
.-----------------------. 
| id  | result | 
|-----------------------| 
| 240  | No  | -- has a site_id 1, 2 and 3 
| 320  | No  | -- has a site_id 1 and 2 
| 421  | Yes  | -- has a site_id 1 only 
| 520  | No  | -- has a site_id 2 
'-----------------------' 

下面是该查询我到目前为止,但它似乎是不正确的

SELECT CASE WHEN count(id) > 1 THEN 'N' ELSE 'Y' END as Result 
FROM table sm 
WHERE sm.site_id IN (1) 
AND sm.site_id NOT IN (2,3,4,5,6,7,8,9) 
AND id = 240 

UPDATE

所以这里是我完整的查询,我从@gordon

SELECT 
    m.merchant_name, 
    m.merchant_id, 
    ut.realname, 
    a.affiliate_name, 
    (select (case when count(site_id) = 1 then 'Yes' else 'No' end) as result 
    from site_merchant sm 
    WHERE sm.merchant_id = m.merchant_id 
    group by merchant_id) as isTjoos, -- y or no 
    (select (case when count(site_id) = 2 then 'Yes' else 'No' end) as result 
    from site_merchant sm 
    WHERE sm.merchant_id = m.merchant_id 
    group by merchant_id) as isUCOnly 
-- isdlkonly -- y or no 
FROM merchant m 
LEFT JOIN merchant_editor_assignment mea ON mea.merchant_id = m.merchant_id 
LEFT JOIN user_table ut ON ut.user_id = mea.user_id 
LEFT JOIN affiliate a ON a.affiliate_id = m.affiliate_id_default 
+0

@lbu。 。 。有多种方式来解释你的问题。你能详细说明吗?特别是,您是否正在寻找具有site_id = 1的1行的id?你在寻找只有site_id = 1的行吗?或者,你在寻找所有行都有相同site_id的id吗? – 2013-02-25 20:20:51

+0

这是一个子查询,我将寻找其他记录,将有site_id 2,只有2和3,只有3; – Ibu 2013-02-25 20:22:21

+0

@Ibu:看看我的答案:SUM是site_id。 – shahkalpesh 2013-02-25 20:26:12

回答

0

您的查询似乎过于复杂的补充答案。刚开始,为什么IN(1)NOT IN(2,3...9)?当你的“结果样本”显然不需要这个时,为什么只限于一个ID(AND id = 240)?这没有任何意义。这个怎么样?

SELECT CASE WHEN count(merchant_id) > 1 THEN 'N' ELSE 'Y' END as isTjoos 
FROM site_merchant 
GROUP BY site_id; 
+0

我不明白这是真的,但我正在尝试 – Ibu 2013-02-25 20:11:18

+0

这不会照顾有1记录与site_id = 2的场景。我想OP是在用site_id = 1来查看记录。 – shahkalpesh 2013-02-25 20:12:58

0

我会使用Having Count语句。类似的东西:

SELECT site_id 
FROM site_merchant 
HAVING (count(merchant_id) > 1) 
GROUP BY site_id; 
1
SELECT 
    it, 
    CASE WHEN COUNT(CASE WHEN site_id THEN 1 END)=1 
      AND COUNT(CASE WHEN site_id!=1 THEN 1 END)=0 THEN 'Yes' 
     ELSE 'No' 
    END 
FROM sm 
GROUP BY it 

请参阅小提琴here

0
SELECT ID, CASE WHEN EXTRA > 1 THEN 'No' ELSE 'Yes' END AS Result 
FROM 
(SELECT ID, Sum(site_id) AS Extra 
from myTable 
GROUP BY ID 
) AS Test 

编辑:我想这应该在MySQL中工作。尽管如此,我还没有努力。
这个想法是SUM上了site_id。对于只有 site_id = 1的记录,总和将为1.

+0

因此,这工作正常我的查询时,我正在寻找site_id = 1,但是当我正在寻找那些与site_id = 2,或3时,一些不再相关 – Ibu 2013-02-25 20:29:18

+0

@Ibu:查询返回是为ID有site_id = 1(只有1条记录),否则返回否。它肯定会提取符合您正在查找的示例输出的数据。 – shahkalpesh 2013-02-25 20:33:00

+0

查看我更新的查询,看起来好像只适用于site_id 1 – Ibu 2013-02-25 21:11:24

3

我对此问题进行了解释,因为您希望只有一个值为site_id的id。我把示例中的问题,是一个例子,与SITE_ID = 1。要做到这一点:

你想用count(distinct)

select id, (case when count(distinct site_id) = 1 then 'Yes' else 'No' end) as result 
from site_merchant sm 
group by id 

稍微更有效的版本是使用min()max(),假设SITE_ID是从未NULL:

select id, (case when min(site_id) = max(site_id) then 'Yes' else 'No' end) as result 
from site_merchant sm 
group by id 

这是因为min和max通常需要少一点的处理比count(distinct)

如果您要检查site_id是否为“1”,而不是其他任何内容,请将条件and min(site_id) = 1添加到when子句中。

如果你想检查SITE_ID为1,恰好有一个行,那么你可以做:

select id, (case when count(site_id) = 1 and min(site_id) = 1 then 'Yes' else 'No' end) as result 
from site_merchant sm 
group by id 

而且,如果你想检查恰好有一个行:

select id, (case when count(site_id) = 1 then 'Yes' else 'No' end) as result 
from site_merchant sm 
group by id 
+0

令人惊讶的是,这将返回我想要的结果,我将不得不研究它以了解发生了什么 – Ibu 2013-02-25 20:14:34

+0

也许最好使用'min(site_id)= max(site_id)和min(site_id)= 1'时的情​​况?无论如何,这是一个好主意,使用最小和最大,+1 – fthiella 2013-02-25 20:17:23

+0

@Ibu:纠正我,如果我错了。只有当site_id = 1存在唯一记录时,才会显示“是”。我不认为上述内容会处理它(至少从您提供的示例中)。即,如果对于id = 421和site_id = 2的单个记录,该怎么办?它应该显示“是”吗? – shahkalpesh 2013-02-25 20:18:26

0

这是我找到的解决方案。我用@Gordons查询上手少了什么是SITE_ID,而并不需要由集团:

SELECT 
    m.merchant_name, 
    m.merchant_id, 
    ut.realname, 
    a.affiliate_name, 
    (select (case when count(*)>0 then 'No' else 'Yes' end) as result 
    from site_merchant sm 
    WHERE sm.merchant_id = m.merchant_id 
    AND site_id != 1) as isTjoos, 
    (select (case when count(*)> 0 then 'No' else 'Yes' end) as result 
    from site_merchant sm 
    WHERE sm.merchant_id = m.merchant_id 
    AND site_id != 2) as isUCOnly, 
    (select (case when count(*)> 0 then 'No' else 'Yes' end) as result 
    from site_merchant sm 
    WHERE sm.merchant_id = m.merchant_id 
    AND site_id != 3) as isDLKonly 
FROM merchant m 
LEFT JOIN merchant_editor_assignment mea ON mea.merchant_id = m.merchant_id 
LEFT JOIN user_table ut ON ut.user_id = mea.user_id 
LEFT JOIN affiliate a ON a.affiliate_id = m.affiliate_id_default 

谢谢你的帮助。

相关问题