2015-02-23 47 views
0

獲取表中的數據我使用垂直極限與MySQL查詢與垂直極限的MySQL

需要獲取數據的幫助,這是我的示例表

----------------- 
| id | pid | text | 
----------------- 
| 1 | 1 | abc | 
| 2 | 2 | def | 
| 3 | 3 | ghi | 
| 4 | 1 | jkl | 
| 5 | 2 | mno | 
| 6 | 4 | pqr | 
| 8 | 2 | vw | 
| 9 | 1 | xyz | 
| 10 | 3 | stu | 
| 11 | 5 | xyz | 
| 12 | 6 | stu | 
----------------- 

我怎樣才能在每一個限制2個數據數據PID在一個查詢

例如表,我想要得到的結果是類似下面

----------------- 
| id | pid | text | 
----------------- 
| 1 | 1 | abc | 
| 4 | 1 | jkl | 
| 2 | 2 | def | 
| 5 | 2 | mno | 
| 3 | 3 | ghi | 
| 10 | 3 | stu | 
| 6 | 4 | pqr | 
| 11 | 5 | xyz | 
| 12 | 6 | stu | 
----------------- 

我可以這樣做嗎? 我嘗試探索發現查詢,但沒有發現

感謝

+0

你問我們如何訂購一個結果集? – Strawberry 2015-02-23 23:00:00

回答

2

有幾種方法可以解決這個。一種方法使用子查詢:

select e.* 
from example e 
where 2 >= (select count(*) 
      from example e2 
      where e2.pid = e.pid and e2.id <= e.id 
      ); 

說明:子查詢是一個相關的子查詢。它正在計算每個id的行數,它們的行數小於給定行id對於相同的pid。也就是說,它正在計算行的等級。 2 >=只是獲取前兩個值的一種方式。

+0

當我第一次看到你的答案時,我以爲你錯過了OP,但後來我又看了一遍,這是一個非常好的解決方案。 (y) – Sasse 2015-02-23 14:47:46

+0

@Sasse你能幫我理解嗎?因爲我仍然和你第一次看到的一樣:-)假設我有5行id = 7和pid = 11,12,13,14,15,所以'WHERE'條件是真還是假? – Alex 2015-02-23 14:56:34

+0

也許通過用'2>'替換'e2.id ='來替代'e2.id <= e.id',可以優化這一點。當然,不要忘記(pid,id)上的多列索引。 – 2015-02-23 15:01:59

0
SET @num := 0, @pid:= ''; 

SELECT t.id, t.pid, t.text 
     @num := if(@pid = t.pid, @num + 1, 1) AS row_number, 
     @pid := t.pid AS dummy 
FROM (
    SELECT * from table_name 
    ORDER BY pid, id 
) as t 
GROUP BY t.id,t.pid, t.text 
HAVING row_number <= 2 
ORDER BY t.id, t.pid; 
1

我不能在Gordon Linoff的回答中寫出如此多的字符,所以我會在這裏寫下它。

我會試着解釋爲什麼Gordon Linoff的解決方案有效,以及它如何工作。

我想起Alex的問題,比如「如果我有一個供應商的桌子和一個帶聯繫人的桌子,每個聯繫人都屬於一個供應商,那麼供應商可以有很多聯繫人,但每個聯繫人只能屬於一個供應商。一個查詢可以返回聯繫人,但是每個供應商可以限制兩個聯繫人,因此我們可以爲一個供應商列出零個聯繫人,但是爲另一個供應商列出兩個聯繫人,但不能超過兩個。

這裏下面是戈登·利諾夫氏液:

select e.* 
from example e 
where 2 >= (select count(*) 
      from example e2 
      where e2.pid = e.pid and e2.id <= e.id 
      ); 

如果我們先跳過這個「裏」 -clause,那麼我們將回報每一位接觸。現在我們需要檢查每個聯繫人,確保每個供應商只能獲得最多兩個聯繫人。

否定的where子句。我們需要做的是確保只選擇兩個具有相同的PID(供應商ID)。因此,對於每個要檢查的聯繫人,我們檢查存在的屬於同一供應商的多少個其他聯繫人(具有相同的pid),並且與我們當前檢查的聯繫人具有較低或相同的id(聯繫人ID)。就是這樣。

因爲如果我們有三個包含同一供應商(pid = 22)的聯繫人(稱爲id 1,4,9),我們計算具有相同pid的聯繫人數量(這意味着具有id 1的聯繫人數量,4和9,因爲所有三個都有22個pid)。然後,我們還檢查聯繫人是否有較低或相同的ID,然後返回計數。因此,當檢查id 1時,count將爲1,因爲只有他自己具有相同的pid和較低或相同的id,那麼當id 4被選中時,我們內部的「select」 - 語句返回2,因爲id 1和id 4都相同pid和id小於或等於4.並且外部select語句中的where子句讀取「2> = 2」。但對於與ID 9的聯繫,所有三個都返回,因爲都具有相同的PID和較低或相等的ID爲9.並且「2> = 3」將是錯誤的,因此與ID 9的聯繫將不會返回。

我認爲這可能是一個錯誤的方式來留下一個重要的評論,但我認爲其他人可能對Gordons解決方案的作用感興趣。

+0

尼斯解釋..謝謝..我現在明白了 – Hans 2015-02-23 22:37:49