2013-07-01 2 views
1

Мне нужно взять массив и использовать его для запроса MySQL.Как создать запрос MySQL с помощью массива?

Я пробовал искать методы, но все они, похоже, связаны с массивами PHP, а не с Ruby.

К примеру, у меня есть terms = ['genetics', 'elderly', 'health'] и я хочу использовать:

con.query "SELECT col1 FROM data1 WHERE MATCH (col2) AGAINST (terms)" 

Возможно ли это?

+1

необходима дополнительная информация. Приведите несколько примеров. –

+0

Так, например, у меня есть термины = [ 'генетика', 'пожилой', 'здоровье'] , и я хочу использовать con.query "SELECT col1 FROM data1 WHERE MATCH (col2) ПРОТИВ (терминов)" является это возможно? – howluocanyougo

+0

что у вас есть, я не вижу. –

ответ

0

Вы можете просто join ваши условия в вашей статье against:

terms = ['genetics' , 'elderly', 'health'] 
con.query "SELECT col1 FROM data1 WHERE MATCH col2 AGAINST ('#{terms.join(' ')}')" 

Обратите внимание, что использование match/against почти наверняка будет более перформативна, чем при использовании ряда like положений. См. Этот ответ StackOverflow для получения дополнительной информации: Which SQL query is better, MATCH AGAINST or LIKE?.

Ознакомьтесь с документацией по MySQL для получения дополнительной информации о полнотекстовом поиске (включая возможных операторов): http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html.

+0

Спасибо за предложение! Я попробовал это, но ничего не ответил. Если это помогает, col2 - это текст с каждой строкой, содержащей абзац, а не только одно слово.Я не уверен, что вот почему это так неприятно Мне удалось получить некоторые результаты, но только отсюда: terms = ['genetics'] _terms = terms.map {| x | "'" + x + "'"} .join (',') rs = con.query "SELECT col1 FROM data1 WHERE MATCH col2 против (# {_ terms})" , как вы можете видеть, я могу только получить результат, когда массив имеет один элемент ... – howluocanyougo

+0

Не нужно использовать теги '', если вам нужно изменить свой ответ. Stack Overflow поддерживает историю ваших изменений, поэтому мы сможем увидеть изменения, если это необходимо. –

+0

именно то, что мне нужно. Спасибо огромное! – howluocanyougo

0

Я настоятельно рекомендую заглянуть в ORM, например Sequel, что позволяет легко генерировать правильный запрос независимым DBM образом.

Это позволяет нам удобно использовать массивы и хэши. Вот an example с использованием массива для создания «где» условие в SQL:

my_posts = posts.where(:category => ['ruby', 'postgres', 'linux']) 
# WHERE category IN ('ruby', 'postgres', 'linux') 

Этот конкретный пример является частью раздела «Фильтрация записей».

В комментарии, ОП сказал:

col2 является текст с каждой строки, имеющей пункт, а не только одно слово.

Затем вы хотите использовать предложение LIKE или regex, которое позволяет проверять каждое слово. См. Раздел «String search functions» в разделе «Фильтрация данных» для того, как Sequel позволяет выполнять поиск внутри строк.

Код будет что-то вроде:

data1.select(:col1).where(Sequel.like(:col2, terms.map{ |t| "%#{ t }%" })) 

, который будет генерировать что-то вроде:

SELECT col1 FROM data1 WHERE ((col2 LIKE '%genetics%') OR (col2 LIKE '%elderly%') OR (col2 LIKE '%health%')) 
+0

Отметьте комментарий @ howluocanyougo на мой ответ, который предполагает, что он/она хочет выполнить полный поиск по индексу, а не запрос 'where/in'. Мой первоначальный ответ, который вы удалили, сказал в значительной степени то же самое, что вы говорите выше (используя AR вместо Sequel). –

+0

Ваш первоначальный ответ все еще существует. Вы можете откат к нему, нажав на ссылку «отредактированный». В этот момент я бы рекомендовал объединить исходный ответ с вашим обновленным ответом, чтобы показать оба вместе с цитатой комментария OP, чтобы выяснить, почему вы добавили новый контент. –

+0

спасибо за предложение! kardeiz на самом деле был прав в том, что я искал, но я обязательно посмотрю на Sequel! – howluocanyougo

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