2015-06-07 31 views
0

我在數據庫中有樣本數據:SQL查詢:其中陣列是在陣列

id (int) name (varchar)   parts (varchar) 
1   some_element    wheel, bearing, hinge, servo 
2   another_element   bearing, servo, lift 
3   third_element   motor, wire 

我想通過部分篩選結果。例如: 我打字輪,伺服 - 沒有結果

我打字車輪,軸承,伺服,鉸鏈 - 返回some_element記錄

我打字軸承,伺服,電梯,車輪,軸承,鉸鏈 - 返回some_elementanother_element

如何構建SQL闕RY?零部件領域有更好的數據類型嗎?

+6

。 –

+2

您使用的是什麼RDBMS? – Mureinik

回答

1

做一些規範化處理,以便您可以更輕鬆地編寫查詢,並且不會出現這種異常情況。

你需要另一種結構,如:

element

+----+---------------+ 
| id | name   | 
+----+---------------+ 
| 1 | some_element | 
+----+---------------+ 
| 2 | another_elem | 
+----+---------------+ 
| 3 | third_elem | 
+----+---------------+ 

part

+----+----------+ 
| id | name  | 
+----+----------+ 
| 1 | wheel | 
+----+----------+ 
| 2 | bearing | 
+----+----------+ 
| 3 | hinge | 
+----+----------+ 
| 4 | servo | 
+----+----------+ 
etc.. 

而另一個,如element_parts到由其他兩個連接m:n關係

+----+---------+---------+ 
| id | elem_id | part_id | 
+----+----------+--------+ 
| 1 | 1  | 1  | 
+----+---------+---------+ 
| 2 | 1  | 2  | 
+----+---------+---------+ 
| 3 | 1  | 3  | 
+----+---------+---------+ 
| 4 | 2  | 3  | 
+----+---------+---------+ 
| 5 | 2  | 4  | 
+----+---------+---------+ 
etc.. 

現在你可以編寫一個查詢,比方說,包含過濾元件(或需要)wheelservo(適應this問題的公認的答案):您需要將資料標準化

select * 
from element e 
where 2 = (
    select count(distinct p.id) 
    from element_parts ep 
    inner join part p on p.id = ep.part_id 
    where p.name in ('wheel', 'servo') 
    and ep.elem_id = e.id 
); 
+0

很簡單!謝謝:) –

+0

那麼,「更簡單的查詢寫作」部分是一個謊言,當然,你可以做一些正則表達式模式匹配魔術(如'LIKE'),但這只是扼殺了這個問題。 – gorhawk