SQL для фильтрации по нескольким измерениям с отношением многие ко многим

0

В моем приложении 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')
    )

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

Теги:
entity-relationship

3 ответа

0

Syntactaclly запрошенный вами текст в порядке. В нем есть две неуважительные вещи, как другие отметили

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

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

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

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

  • Запустите его в Workbench (или другом клиенте) и проверьте результаты
  • Если ошибок нет, и никакая запись не будет возвращена, запустите некоторые запросы в workbench

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

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

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

  • 0
    Спасибо за это. Да, для демонстрационных целей, это идентификатор. Я работал в Workbench - так что знайте, что с этой точки зрения все в порядке. Запросы, которые вы написали, возвращают 1 и 2 с уважением, что и ожидается. Спасибо за ваш вклад, хотя.
  • 0
    @Denseflux Итак, вы получите ожидаемое в WorkBench, но не в Ruby? Походит на проблему Рубина для меня. Извините, я не Ruby человек.
0

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

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

Обычно вы хотите установить отношения "как", как условия соединения, и значения (литералы) для фильтрации в разделах where

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

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

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

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

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

  • 0
    Это может быть суть проблемы. Моя таблица course_categories_courses содержит course_categories_id и course_id, используя мои примеры данных, есть записи для: - course 1 | средний курс 1 | ближний курс 2 | дальний курс 2 | Короче говоря, я хочу, чтобы он вернул только курс 1. На данный момент он не возвращает ни того, ни другого.
  • 0
    Я думаю, что Джни дошел до сути. вторая (ближняя / дальняя) часть должна быть location , а не id

Ещё вопросы

Сообщество Overcoder
Наверх
Меню