2015-08-19 36 views
0

給出結果我用這MySQL查詢從DBMySQL查詢在錯誤的順序

當我輸入

rua Gomes de Ca 

此查詢執行讀取數據

SELECT DISTINCT CONCAT(streetObj.street_type, ' ',streetObj.street_name, ', ', neighborhoodObj.name , ', ', cityObj.name, ', ', stateObj.abbreviation) namet 
      FROM street streetObj 
      LEFT 
      JOIN cep cepObj1 
       ON cepObj1.street_id = streetObj.street_id 
      LEFT 
      JOIN neighborhood neighborhoodObj 
       ON neighborhoodObj.neighborhood_id = cepObj1.start_neighborhood_id 
      LEFT 
      JOIN city cityObj 
       ON streetObj.city_id = cityObj.city_id 
      LEFT 
      JOIN state stateObj 
       ON stateObj.state_id = cityObj.state_id 
      WHERE CONCAT(streetObj.street_type,streetObj.street_name) LIKE '%rua%' 
      AND CONCAT(streetObj.street_type,streetObj.street_name) LIKE '%Gomes%' 
      AND CONCAT(streetObj.street_type,streetObj.street_name) LIKE '%de%' 
      AND CONCAT(streetObj.street_type,streetObj.street_name) like '%Ca%' 
      AND cityObj.city_id = '9668' 
      ORDER 
       BY namet ASC 
      LIMIT 10; 

而且這個查詢結果是這樣的

Rua Baltazar Gomes de Alarcão, Jardim Miriam, São ... 
Rua Cabo José Gomes de Barros, Conjunto Habitacion... 
Rua Cabo Luís Gomes de Quevedo, Parque Novo Mundo,... 
Rua Gomes de Carvalho, Vila Olímpia, São Paulo, SP 
Rua João Gomes de Mendonça, Jaraguá, São Paulo, SP 
Rua João Gomes de Mendonça, Jardim Taipas, São Pau... 
Rua Pedro Gomes de Camargo, Vila Rio Branco, São P... 

因此,大家可以看到,我想在上面這些成果找到精確匹配,但它不工作。 在此查詢我想

Rua Gomes de Carvalho, Vila Olímpia, São Paulo, SP 
在頂部位置

+0

別名是不是表名長。好主意。 – Strawberry

+0

@renu,澄清,草莓是諷刺。 – AdrianBR

回答

0

您需要通過比賽的強度對結果進行排序和排序通過。你將不得不自己定義排序。例如:

select .. 
from... 
ORDER BY 
case 
when text like "%all my search phrase%" then 1 
when text like "%all my%" then 2 
when text like "%search phrase%" then 2 
when text like "%phrase%" then 3 
else 1000 end 
DESCENDING 

ORDER BY 
case when text like "%word%" then 1 else 0 end 
+ 
case when text like "%second_word%" then 1 else 0 end 
+ 
..... 
DESC 

專門爲你的榜樣

select namet from 
    (select 'Rua Baltazar Gomes de Alarcão, Jardim Miriam, São ...' as namet 
    union all select 'Rua Cabo José Gomes de Barros, Conjunto Habitacion...' 
    union all select 'Rua Cabo Luís Gomes de Quevedo, Parque Novo Mundo,...' 
    union all select 'Rua Gomes de Carvalho, Vila Olímpia, São Paulo, SP' 
    union all select 'Rua João Gomes de Mendonça, Jaraguá, São Paulo, SP' 
    union all select 'Rua João Gomes de Mendonça, Jardim Taipas, São Pau...' 
    union all select 'Rua Pedro Gomes de Camargo, Vila Rio Branco, São P...')tbl 
order by 
case when namet like "%rua gomes de ca%" then 100 else 0 end+ #high score for full match 
case when namet like "%rua%" then 1 else 0 end+ #lower score for partial matches 
case when namet like "%Gomes%" then 1 else 0 end+ 
case when namet like "%de%" then 1 else 0 end+ 
case when namet like "%ca%" then 1 else 0 end desc LIMIT 10 

雖然你可能想寫點東西給你的搜索短語拆分成單詞,搜索每一個字,並排名匹配的詞數。您還可以查看soundex或levenstein距離以獲得排名相似度。在SQL中做它比編程更難。

+0

對不起,但它不工作。嘗試此http://pastebin.com/i5Y8zPqq –

+0

你應該降序排序。我嘗試了下面和它的工作 選擇PRODUCT_NAME從表ø 爲了通過 情況下,當PRODUCT_NAME像「%W1%」,則1否則爲0端 +情況下,當PRODUCT_NAME像「%W2%」,則1否則爲0端 + case product like like「%w3%」then 1 else 0 end desc limit 10 – AdrianBR

+0

http://pastebin.com/nJwiMrdB – AdrianBR