2017-10-20 64 views
0

我看起來像是一組工作的SQL語句,它們在一個下拉式場景下運行。第一個是全包式AND,每個請求的選項都匹配。如果失敗了,它將轉到基於OR的第二個SQL調用。我怎樣才能使這種SQL排序最相關?

有人可以向我解釋或提供更好的語句,其中第二層OR場景是最相關的第一個排序,這意味着大多數選項匹配作爲第一個條目,並從那裏向下?

或者,或者,如果您有更好的方法來處理此搜索,可能只需一次調用,那樣會更好。

第一個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

我懷疑你想要的:

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

這似乎確實做得很好,謝謝。 –