簡體   English   中英

選擇查詢以基於一列的多個值檢索結果(AND條件)

[英]Select query to retrieve results based on multiple values for a one column (AND condition)

有以下三個表

表1-車輛

Vehicle_Id主鍵
名稱
序列號

表2-屬性名稱

Property_Id主鍵
名稱

表3-屬性

Property_Id(FOREIGN KEY)從Propertyname表中引用Property_Id

ID(FOREIGN KEY)引用了Vehicle表中的Vehicle_Id

樣本數據

表1-車輛

Vehicle_Id    Name    Serial_Number
1000        WagonR    Maruti-WagonR 
1001        Estilo    Maruti-Estilo 
1002        Zen       Maruti-Zen    

表2-屬性名稱

Property_Id    name
100            Mileage 
101            FuelType
102            Country 

表3-屬性

Property_Id    Value    Id
100            50       1000 
101            Petrol   1000 
102            India    1000 
100            35       1001 
101            Diesel   1002 

從這三個表中,我們可以看到每輛車都有一組屬性,這些屬性在“屬性”表中保留為行。 這樣做是為了在向車輛添加更多屬性的情況下,為車輛添加行條目,而不是添加不可行的列。

現在,我有一個用戶界面,可以在其中基於車輛進行搜索

1)名稱,序列號-可在“車輛”表中的列中使用,
2)里程,燃油類型,國家/地區-這些是特定車輛的屬性

用戶可以在上面的1)和2)中輸入值的任意組合以搜索車輛列表。

例如:-如果用戶輸入Mileage為50,FuelType為Diesel,則我應獲取Mileage為50 AND FuelType為Diesel的車輛的結果。

我嘗試以下SQL語句執行相同的操作

select vh.Vehicle_Id, vh.name, pt.Property_Id, pn.name, pt.value
from property pt
inner join propertyname pn
on pt.Property_Id=pn.Property_Id
inner join vehicle vh
on vh.Vehicle_Id=pt.Id
and ((pn.Name='Mileage' AND pt.Value='50') AND (pn.Name='FuelType' AND pt.Value='Petrol'));

但是由於單行結果的AND條件,我得到的結果為零。 但是,如果我將最后一個AND條件更改為OR,則會得到兩個符合條件的結果。

但是我試圖獲取同時匹配兩個屬性的車輛。

我嘗試使用INTERSECT,兩個SQL語句的內部聯接等。但是無法獲得結果。

任何人都可以建議我最好的方法來搜索兩個屬性名稱,即以行而不是列存在的值對,以獲取准確的搜索結果。

您的問題是PropertyName不能同時為'Mileage'和'FuelType'

您可以找到所有id在兩個propertyNames相交處的所有車輛,如下所示

select Vehicle_Id, Vehicle.Name, Serial_Number, PropertyName.Name, Property.Value
from Vehicle
join Property on (Property.Id = Vehicle.Vehicle_Id)
join PropertyName on (PropertyName.Property_Id = Property.Property_Id)
where Vehicle_id in 
(select Id 
    from PropertyName 
    Join Property on (PropertyName.Property_Id = Property.Property_Id)
    where PropertyName.Name = 'Mileage' and Property.Value = '50'
 intersect 
 select Id 
    from PropertyName 
    Join Property on (PropertyName.Property_Id = Property.Property_Id)
    where PropertyName.Name='FuelType' AND Property.Value='Petrol'
 )


Vehicle_Id  Name    Serial_Number   Name    Value
1000    WagonR  Maruti-WagonR   Mileage 50
1000    WagonR  Maruti-WagonR   FuelType    Petrol
1000    WagonR  Maruti-WagonR   Country India

有多種方法

我會做這樣的事情

select vh.Vehicle_Id, pt_m.value as [Mileage], pt_f.value as [FuelType]
from vehicle vh
inner join propertyname pn_m ON pn_m.Name='Mileage'
inner join propertyname pn_f ON pn_f.Name='FuelType' 
inner join property     pt_m on pt_m.Property_Id=pn_m.Property_Id AND pt_m.Id = vh.Vehicle_Id
inner join property     pt_f on pt_f.Property_Id=pn_f.Property_Id AND pt_f.Id = vh.Vehicle_Id

加入兩個屬性時,需要為屬性名稱表使用兩個別名,並且類似地,需要為屬性值使用兩個別名

這樣做的優點是,它可以快速適應於其中實際上沒有填充其中一項屬性的車輛

select vh.Vehicle_Id, pt_m.value as [Mileage], pt_f.value as [FuelType]
from vehicle vh
left join propertyname pn_m ON pn_m.Name='Mileage'
LEFT join propertyname pn_f ON pn_f.Name='FuelType' 
LEFT join property     pt_m on pt_m.Property_Id=pn_m.Property_Id AND pt_m.Id = vh.Vehicle_Id
LEFT join property     pt_f on pt_f.Property_Id=pn_f.Property_Id AND pt_f.Id = vh.Vehicle_Id

甚至處理不一致的屬性名稱

select vh.Vehicle_Id, pt_m.value as [Mileage], pt_f.value as [FuelType]
from vehicle vh
left join propertyname pn_m ON pn_m.Name='Mileage'
LEFT join propertyname pn_f ON pn_f.Name IN ('FuelType','Fuel Type') 
LEFT join property     pt_m on pt_m.Property_Id=pn_m.Property_Id AND pt_m.Id = vh.Vehicle_Id
LEFT join property     pt_f on pt_f.Property_Id=pn_f.Property_Id AND pt_f.Id = vh.Vehicle_Id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM