2015-08-19 3 views
0

Я использую этот MySQL запрос для выборки данных из БДMYSQL запрос дает результат в неправильном порядке

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 Gomes de Ca 

И этот результат запроса это

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_name нравится «% w3%», затем 1 else 0 end desc limit 10 – AdrianBR

+0

http://pastebin.com/nJwiMrdB – AdrianBR

Смежные вопросы