2012-07-23 123 views
0

我有一點SQL n00b時刻。假設我有一個包含兩個表格的物業網站:propertiesfeatures,並附有一個表格。如果我有搜索表單,如何構建我的查詢以僅選擇所有所選條件的屬性?SQL查詢根據條件選擇記錄?

例如,標準將在從複選框的陣列的形式被張貼:

Array 
(
    [features] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 5 
     ) 
) 

如何可以選擇從我properties個具有的ID特徵記錄1,2和5(以及可能的其他),但只有一個或兩個屬性不匹配?

+0

你可以把它的小提琴:sqlfiddle.com – 2012-07-23 11:49:43

+0

@BugFinder我已經嘗試過使用'IN',但是返回的記錄有任何*選定的標準,而不是所有的記錄*選擇標準。 – 2012-07-23 11:56:29

回答

3

您可以過濾通過產權連接表感興趣的功能,然後組和限制結果集,只有那些包含的記錄所需組數:

SELECT properties.* 
FROM  properties JOIN propfeatures USING (property_id) 
WHERE propfeatures.feature_id IN (1,2,5) 
GROUP BY property_id 
HAVING COUNT(DISTINCT propfeatures.feature_id) = 3 

當然,如果唯一性有保證,您可以保存DISTINCT操作,而只需使用COUNT(*)

+0

我不確定上述內容在做什麼。它可以分解多一點嗎? – 2012-07-23 15:14:21

+0

@MartinBean:你熟悉GROUP BY嗎?它將多個記錄聚合到單個結果行中:在這種情況下,所有記錄具有相同的'property_id'。由於'WHERE'子句僅對那些感興趣的特徵過濾'propfeatures',而'HAVING'子句將結果限制爲包含3條記錄的那些組,因此我們只選擇那些具有全部3個所需特徵的屬性。 – eggyal 2012-07-23 15:26:09

+0

太好了。謝謝! 「 – 2012-07-23 20:22:40

0

如果propertiesfeatures表由列feature_idproperties表中features表連接到id,那麼我們可以這樣做:

SELECT a.* FROM `properties` AS a JOIN `features` AS b WHERE 
a.`feature_id`=b.`id` AND b.`id` IN (1,2,5) ORDER BY a.`feature_id` ASC; 

希望這有助於。

+0

」*但只有一個或兩個屬性不匹配?*「 – eggyal 2012-07-23 12:05:23

+0

@eggyal - 哦!對不起,錯過了那部分..我使用的測試表沒有照顧。在這種情況下,你的解決方案將起作用+1。 – 2012-07-23 12:16:34