2011-08-30 39 views
0

我跑了如下因素查询SELECT:从一个独特的名单

SELECT DISTINCT hardware_id, model, make from Table1 order by hardware_id; 

我的问题是,在一组的结果,我想看到只有hardware_id多次出现,其中的结果。

例子:

硬件1个MODEL1使1个

硬件1个MODEL2使1

硬件2个MODEL2使1>我不想看到这个,因为有硬件的只有1个occurence 2

硬件3个MODEL2使1个

硬件3个MODEL2使1

任何想法我可以做到这一点?

=====

的概率是,我不能使用,因为我的DISTINCT标志的下面的查询:

SELECT hardware_id,model,make from Table1 WHERE hardware_id IN (SELECT DISTINCT hardware_id, model, make from Table1 order by hardware_id) where count(hardware_id) >= 2;

我绝对需要使用不同(hardware_id,模型,品牌)

任何想法?

+0

该表是否有PRIMARY KEY? –

+0

是否有与'hardware_id','model'和'make'完全相同的行? –

+0

不,三元组(hardware_id,model,make)必须是不同的。 – Rgonomike

回答

2
SELECT hardware_id, model, make 
FROM table1 
GROUP BY hardware_id -- group by orders the rows ASC as a side effect. 
HAVING count(hardware_id) > 1 

然而,这将选择modelmake *随机*值。
你可能要考虑使用:

SELECT hardware_id, GROUP_CONCAT(DISTINCT CONCAT(model,' - ',make)) AS modelmakes 
FROM table1 
GROUP BY hardware_id -- group by orders the rows ASC as a side effect. 
HAVING count(hardware_id) > 1 

你也可以做一个加入对第一选择,以获得您所需要的所有行,你不应该需要不同。

SELECT t1.hardware_id, t1.make, t1.make 
FROM table1 t1 
INNER JOIN (
    SELECT hardware_id 
    FROM table1 
    GROUP BY hardware_id 
    HAVING count(hardware_id) > 1 
      ) t2 ON (t1.hardware_id = t2.hardware_id) 
+0

您将需要'GROUP_CONCAT(CONCAT(model,,' - ',make))'将表与行hard1,model1,make1'和'hard1,model2, make2'和'hard1,model2,make1' –

+0

@Ypercube,好点。 – Johan

+0

我得到这组结果: 的Mac @ \t E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752, E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,K3715,K3715,E1752,E1752,E1752,K3715,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752,E1752, E1752,E1752,E1752,E1752,E1752 \t华为,华为,华为,华为,华为,华为,华为,华为,华为,华为,华为,华为,华为,华为,华为,华为,华为,华为,华为--- 如何消除重复? – Rgonomike

3
SELECT hardware_id, model, make 
FROM Table1 AS t 
WHERE EXISTS 
     (SELECT * 
     FROM Table1 AS td 
     WHERE td.hardware_id = t.hardware_id 
      AND td.id <> t.id     --- if id is the PK of the table 
    ) 
ORDER BY hardware_id 

由于该表有重复(hardware_id, model, make)三胞胎,你可以使用它代替:

SELECT DISTINCT hardware_id, model, make 
FROM Table1 AS t 
WHERE EXISTS 
     (SELECT * 
     FROM Table1 AS td 
     WHERE td.hardware_id = t.hardware_id 
      AND (td.model, td.make) 
       <> (t.model, t.make)    
    ) 
ORDER BY hardware_id 
+0

为什么不是一个简单的'群...有...'? – Johan

+0

@Johan:你的意思是'GROUP BY .. HAVING'和'JOIN'。 –

+0

嗨,主键被称为“ID”。诀窍是三元组(hardware_id,model,make)必须与众不同! – Rgonomike

0

尝试此查询:

SELECT hardware_id, model, make from Table1 where hardware_id in 
    (select hardware_id 
    from TABLE1 group by hardware_id having count(hardware_id) > 1); 

另一个版本:

SELECT hardware_id, model, make from Table1 t where EXISTS( 
    select hardware_id 
    from TABLE1 where hardware_id = t.hardware_id 
    group by hardware_id having count(hardware_id) > 1 
); 
1

您将需要子查询重复的硬件ID,并将此列表加入到您的查询中。子查询可以是:

SELECT hardware_id 
FROM Table1 
GROUP BY hardware_id 
HAVING COUNT(hardware_id) > 1 

然后,你可以把它加入到你的原始查询:

SELECT hardware_id, model, make 
FROM Table1 
INNER JOIN (
    SELECT t1.hardware_id 
    FROM Table1 t1 
    GROUP BY t1.hardware_id 
    HAVING COUNT(t1.hardware_id) > 1 
) AS join1 ON (join1.hardware_id = Table1.hardware_id) 
ORDER BY hardware_id ASC;