2017-10-20 4 views
0

私はドロップダウンシナリオで動作するSQL文の作業セットのように見えます。最初のものはすべてを含むANDで、要求されたオプションはすべて一致します。それに失敗すると、ORに基づいた2番目のsql呼び出しに行きます。どのように私はこのSQLソートを最も関連性の高いものにすることができますか?

第2層のORシナリオが最も関連性の高い順にソートされている場合、誰かが説明してください。つまり、ほとんどのオプションが最初のエントリとして一致し、そこから下に行くということですか?

または、この検索を処理する方が良い場合は、1回の呼び出しで可能ですが、これはさらに優れています。

最初のSQLに基づいてコールAND:

SELECT 
    l.id,l.title,l.city 
FROM listings l 
JOIN listings_facilities_xref x ON l.id = x.listing_id 
WHERE l.property_type = '1' 
    AND x.facility_id = '1' 
    AND x.facility_id = '8' 
    AND x.facility_id = '54' 
    AND x.facility_id = '11' 
    AND l.city = 'Orlando' 
    AND l.state = '16' 
GROUP BY l.id 

第二階層に基づいてコールOR:

SELECT l.id,l.title,l.city 
FROM listings l 
JOIN listings_facilities_xref x ON l.id = x.listing_id 
WHERE l.property_type = '1' 
AND (
    x.facility_id = '1' 
    OR x.facility_id = '8' 
    OR x.facility_id = '54' 
    OR x.facility_id = '11' 
) 
AND l.city = 'Orlando' 
AND l.state = '16' 
GROUP BY l.id 

次のように私のテーブルレイアウトは次のとおりです。

mysql> describe listings; 
+---------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+---------------+--------------+------+-----+---------+----------------+ 
| id   | int(12)  | NO | PRI | NULL | auto_increment | 
| owner_id  | int(12)  | NO |  | NULL |    | 
| property_type | int(12)  | NO |  | NULL |    | 
| title   | varchar(100) | NO |  | NULL |    | 
| description | text   | NO |  | NULL |    | 
| yearbuilt  | int(12)  | NO |  | NULL |    | 
| beds   | int(11)  | NO |  | NULL |    | 
| baths   | int(11)  | NO |  | NULL |    | 
| sleeps  | int(11)  | NO |  | NULL |    | 
| sqfeet  | int(12)  | NO |  | NULL |    | 
| lotsize  | int(12)  | NO |  | NULL |    | 
| address1  | varchar(255) | NO |  | NULL |    | 
| address2  | varchar(255) | NO |  | NULL |    | 
| city   | varchar(100) | NO |  | NULL |    | 
| state   | int(12)  | NO |  | NULL |    | 
| zipcode  | varchar(50) | NO |  | NULL |    | 
| latitude  | varchar(50) | NO |  | NULL |    | 
| longitude  | varchar(50) | NO |  | NULL |    | 
| created  | int(12)  | NO |  | NULL |    | 
| updated  | int(12)  | NO |  | NULL |    | 
+---------------+--------------+------+-----+---------+----------------+ 

mysql> describe listings_facilities_xref; 
+-------------+---------+------+-----+---------+----------------+ 
| Field  | Type | Null | Key | Default | Extra   | 
+-------------+---------+------+-----+---------+----------------+ 
| id   | int(12) | NO | PRI | NULL | auto_increment | 
| listing_id | int(12) | NO |  | NULL |    | 
| facility_id | int(12) | NO |  | NULL |    | 
| category_id | int(12) | NO |  | NULL |    | 
+-------------+---------+------+-----+---------+----------------+ 

サンプルのインポートデータは

にあります。

リスト:https://pastebin.com/EeuaEFrR

listings_facilities_xref:https://pastebin.com/7WeHgEaE

+1

があなたのバージョン。 –

+1

最初のクエリは常に失敗します。 facility_idが1と11と5になるような行はありません。 – Valli

+0

Gordon、Valli:今はおかげです。時間が長すぎます。 –

答えて

1

私は、あなたがしたいと思われる: `AND`がローを返さないだろうと

SELECT l.id, l.title, l.city 
FROM listings l 
JOIN listings_facilities_xref x ON l.id = x.listing_id 
WHERE l.property_type = 1 AND 
     x.facility_id IN (1, 8, 54, 11) AND 
     l.city = 'Orlando' AND 
     l.state = 16 
GROUP BY l.id, l.title, l.city 
ORDER BY COUNT(*) DESC; 
+0

それは非常によく、おかげでトリックを行ったようです。 –

関連する問題