SQL для фильтрации по нескольким измерениям с отношением многие ко многим - PullRequest
0 голосов
/ 16 мая 2011

В моем приложении rails у меня есть три таблицы, чтобы разобраться с отношением «многие ко многим» между курсами и категориями

  • курсы
  • course_categories_courses
  • course_categories

У меня есть группы категорий, и я хочу разрешить фильтрацию списка курсов по категориям через такой интерфейс, как:

Местоположение

  • очень близко
  • рядом
  • до

Тип

  • короткий
  • средний
  • долго

Для поиска средних типов, близких или далеких, я думал использовать:

SELECT distinct courses.* 
FROM `courses` 
  inner join course_categories on 
    course_categories_courses.course_category_id = course_categories.id 
    and (
      course_categories.id in ('medium') 
      and course_categories.id in ('near', 'far')
    )

но это не работает. Кто-нибудь может указать мне правильное направление, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 16 мая 2011

Вы должны объединить обе таблицы, и вы используете поле идентификатора, в котором должны использоваться тип и местоположение (согласно вашему описанию)

SELECT distinct courses.* FROM `courses` 
inner course_categories_courses on course_categories_courses.course_category_id = courses.course_category_id
inner join course_categories on 
course_categories.id = course_categories_courses.id
where  (course_categories.type in ('medium') and course_categories.location in ('near', 'far'))
0 голосов
/ 16 мая 2011

Синтаксически только что написанный вами запрос в порядке. Есть две необычные вещи об этом, как отметили другие

  1. Фильтр по внутреннему объединению. (Обычно это делается где, но, возможно, у вас есть свои причины)
  2. course_categories.id in ('medium'). Многие ожидают, что число здесь, но, возможно, это только для демонстрационных целей.

Причина этого "не работает"

  1. Вы получаете сообщение об ошибке, которую вы скрыли под рубрикой в ​​своем рубине, которой вы не делитесь
  2. Работает, просто нет записей, соответствующих вашим критериям.

Способы отладки .

  1. Запустите его в Workbench (или другом клиенте) и проверьте результаты
  2. Если ошибок нет и записи не возвращаются, выполните некоторые запросы в рабочей среде

    Select count(*) from course_categories where course_categories.id in ('medium')

    Select count(*) from course_categories where course_categories.id in ('near', 'far')

  3. Если вы получили желаемые результаты в Workbench, то это, вероятно, ваш клиентский (Ruby) код, возможно, неверная строка соединения?

0 голосов
/ 16 мая 2011

Как правило, вы хотите указать «отношения» в качестве условий соединения и значений (литералов) для фильтрации в предложениях where

ex.условие соединения - on course_categories_courses.course_category_id = course_categories.id

отл.предложение where - where course_categories.id in ('near', 'far')

Так что вы можете переписать свой запрос таким образом.Но более того, как оба эти варианта могут быть правдой?

(course_categories.id in ('medium') and course_categories.id in ('near', 'far'))

Это то, что вы намереваетесь?

...