как выбрать строку, если в связанной таблице несколько значений - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь создать фильтр, чтобы найти все stuffs из различных substances.

В базе данных есть:

  • a stuffs таблица
  • a substances таблица
  • a stuffs_substances таблица соединения,

Теперь я хочу найти только все stuffs, которые сделаны из gold И silver (не все материалы, содержащие золото, и все материалы, содержащие серебро).

И последнее: конечный пользователь может ввести только часть имени вещества в поле формы фильтра.Например, он наберет silv, и он покажет все материалы, сделанные из silver.

Итак, я сделал этот запрос (не работает):

select "stuffs".* 
from "stuffs" 
  inner join "stuffs_substances" as "substances_join"
    on "substances_join"."stuff_id" = "stuffs"."id" 
  inner join "substances" 
    on "substances_join"."substance_id" = "substances"."id" 
where ("substances"."name" like '%silv%') 
and ("substances"."name" like '%gold%')

Возвращает пустой массив.Что я здесь не так делаю?

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

если вы хотите выполнить поиск по части слова, то выполните действие для повторного выполнения запроса каждый раз, когда пользователь вводит букву слова, и фильтрующую часть в запросе в случае oracle sql, в случае поиска только со стартовой частью.

where name like :what_user_write || '%'

или в случае, если какая-либо часть слова

where name like '%' || :what_user_write || '%'

, вы также можете использовать CAB, чтобы убедиться, что пользователь может выполнять поиск по прописной или маленькой цифре, независимо от того,

0 голосов
/ 29 ноября 2018

хорошо, вы спрашиваете о соединении, я проверяю это в mysql, он работает, чтобы найти вещи, сделанные из золота, серебра или серебра и так далее, надеюсь, эта помощь

select sf.id, ss.code, sf.stuff_name from stuffs sf, stuffs_substances ss , substances s
where sf.id = ss.id
and  s.code = ss.code
and s.sub_name like  'gol%'
0 голосов
/ 29 ноября 2018

По сути, вы просто хотите агрегировать:

select st.*
from "stuffs" st join
     "stuffs_substances" ss join
     on ss."stuff_id" = st."id" join
     "substances" s
     on ss."substance_id" = s."id" 
where s."name" like '%silv%' or 
      s."name" like '%gold%'
group by st.id
having count(*) filter (where s."name" like '%silv%') > 0 and
       count(*) filter (where s."name" like '%gold%') > 0;

Обратите внимание, что это работает, предполагая, что stuff.id является первичным ключом в stuffs.

Я не понимаю вашувлечение двойными кавычками и длинными псевдонимами таблицы.Для меня эти вещи только затрудняют написание и чтение запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...