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;